我正在使用一些代碼來處理各種回調的異步操作; Snow Leopard使用塊和GCD使這非常容易。NSOperationQueue在Snow Leopard上的輕量級?
我從NSBlockOperation
像這樣叫NSTask
:
[self.queue addOperationWithBlock:^{
NSTask *task = [NSTask new];
NSPipe *newPipe = [NSPipe new];
NSFileHandle *readHandle = [newPipe fileHandleForReading];
NSData *inData = nil;
[task setLaunchPath:path];
[task setArguments:arguments];
[task launch];
while ((inData = [readHandle availableData]) && [inData length]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// callback
}];
}
[task waitUntilExit];
}];
這種方法完美的作品。這就像魔術一樣,只要我的回調正確處理併發。
現在,我希望能夠合併這些呼叫中的一部分;這是在模型對象的「刷新」方法中,可能需要很長時間才能完成。讓用戶敲擊刷新按鈕不應該捆綁機器等等。
我可以在這裏看到執行困境。我可以創建一大堆隊列 - 每個呼叫類型 - 並將其併發操作計數設置爲1,然後每當需要新呼叫時撥打-cancelAllOperations
。或者,我可以做一些更多的手動簿記,目前正在調用哪些調用,併爲每個模型對象管理單個隊列(如我所做的那樣),或者我可以更進一步並使用全局隊列。
NSOperationQueue
有多重?是否創建了很多排隊糟糕的架構決策?有沒有更好的方法來合併這些任務?
僅供參考,您正在泄漏您的NSTask和您的NSPipe。 + new相當於+ alloc/-init,這意味着你有責任釋放它們......你永遠不會做(在你的代碼中)。 (當然,除非你使用GC) – 2009-10-03 15:58:07
這是一個僅限雪豹的程序。我當然希望你的全新Snow-Leopard-only代碼是垃圾收集的。 :-D – 2009-10-03 22:52:29