2011-09-28 59 views
1

我填充NSOutlineView递归阅读目录。 后一个目录及其子目录被读我刷新轮廓主叫reloadData一个调度内像下面所示UI刷新,NSOutlineView reloadData和递归方法

-(void)readDir:(NSString*)path { 
    dispatch_async(dispatch_get_main_queue(), ^{ \ 
     [outlineView reloadData]; 
    }); 

////////// 
//// some internal stuff 
////////// 

    NSArray* subs = [self getSubDirs:path]; 
    for (NSString* p in subs) { 
     [self readDir:p]; 
    } 
} 

上述方法,是从一个调度内被称为具有UI反应

- (void)startAll { 
     dispatch_queue_t queue = dispatch_get_global_queue(0, 0); 
     dispatch_async(queue, ^{ 
      [self readDir:@"/"]; 
     }); 
    } 

的问题是,有时dispatch_async(dispatch_get_main_queue(),...)在子目录正在读取时调用(它是异步的!)和应用程序崩溃

如果我使用dispatch_sync(dispatch_get_main_queue(),...) 同步版本)的轮廓正确总是画,但它是非常非常slooooow所以问题是:

我怎么可以重新排列代码以尽可能快的是,等待那DISPATCH-[A]同步(dispatch_get_main_queue() , ...) 已完成?

回答

3

这听起来像问题是,虽然some internal stuff在一个线程中执行,你的模型是在reloadData不能正确处理不一致的状态。

在充分设置之前是否将目录条目添加到其父目录?

+0

确实要删除(不加)项目阵列作为数据的问题似乎与资源。我已经解决了删除主队列中使用的代码块内的项目,似乎工作,但我不确定 – dafi

1

末到本之一,但似乎它将使很多更有意义的写readDir:这样的:

-(void)readDir:(NSString*)path { 
    ////////// 
    //// some internal stuff 
    ////////// 

    NSArray* subs = [self getSubDirs:path]; 
    for (NSString* p in subs) { 
     [self readDir:p]; 
     // now refresh outline with newly acquired info and current data 
     dispatch_sync(dispatch_get_main_queue(), ^{ \ 
      [outlineView reloadData]; 
     }); 
    } 
}