我填充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() , ...) 已完成?
確實要刪除(不加)項目陣列作爲數據的問題似乎與資源。我已經解決了刪除主隊列中使用的代碼塊內的項目,似乎工作,但我不確定 – dafi