1

我有一個要花費很多時間和資源,一些圖像處理,所以我用NSOperation + NSOperatioQueue +委託回調。和所有的工作。的NSOperation與completition塊

現在我想使用塊,因爲它在桌面視圖中的使用非常優雅和簡單。

什麼,我需要做的是一樣AFJSONRequestOperation例如:

NSURL *url = [NSURL URLWithString:@"url"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
NSLog(@"App.net Global Stream: %@", JSON); 
} failure:nil]; 
[operation start]; 
在這個例子中我沒有看到任何operationQueue

!我怎麼能這樣做?

[ImageManagerOperation modifyImage:(UIImage*)image completitionBlock:(void (^)(UIImage *modifiedImage))complete]; 

其中ImageManagerOperation是一個NSOperation。

我知道我可以設置完成塊的,但我仍然需要在隊列中添加操作。

我想盡量減少我的代碼中的行號(如果可能:))。

回答

1

通常在NSOperation代碼是同步的。 NSOperationQueue提供了在後臺運行代碼所需的線程。因此,您將操作添加到隊列中,然後隊列在後臺線程上對您的操作調用start

AFJSONRequestOperation是叫concurrent一種特殊類型的NSOperation,這意味着操作已經提供了它自己的後臺線程內部。在某些情況下,您可以在隊列外調用start操作的concurrent操作方法。由於該操作已經提供了自己的後臺線程,它仍然會在後臺運行。在這種情況下,可能會直接調用start以最小化示例中顯示的代碼。

通常情況下,因爲你要採取其他的事情隊列提供了諸如管理dependanciesmaxConcurrentOperationCount優勢,你仍然會增加concurrent操作的NSOperationQueue

所以只是自己創建一個NSOperationQueue和您的操作添加到它。你不需要撥打start隊列會爲你做這個。

+0

謝謝你,所以最後我要創建我自己的隊列,對於我的tableView這樣,這將是很大的努力,所以我做到這一點與GCD,並且做工精細,真的讓我很 – 2013-03-16 23:37:41

+0

謝謝你,所以最後,我必須創建自己的隊列,爲了適應tableView需要付出很大的努力,所以我使用GCD來做這件​​事,並且工作正常(我認爲GCD使用正確的操作?)。你回答我的問題,所以我接受它謝謝:) – 2013-03-16 23:52:34

+0

不,NSOperation使用GCD而不是其他方式。這聽起來像你需要一個隊列,所以你可以限制你從你的表格視圖做的工作量。我假設你正在爲每個單元格工作而滾動?如果有人滾動很多,你可能會開始太多的工作。使用隊列有助於限制這一點,並讓您取消可能已爲單元啓動的任務,但由於用戶已滾動而不再需要。有一個WWDC(我認爲2012)會議深入討論了這一點。如果這也是你正在做的事情,你應該看這個視頻。 – 2013-03-19 13:44:35