2011-09-28 60 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]; 
     }); 
    } 
}