我有一些图像处理需要花费很多时间和资源,所以我使用NSOperation
+ NSOperatioQueue
+委托来进行callBack。和所有工作。
现在我想使用块,因为它非常优雅且易于在tableView中使用。
我需要做的就像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。
我知道我可以设置完成块,但我仍然需要在队列中添加操作。
我想最小化代码中的行号(如果可能的话):)。
答案 0 :(得分:1)
通常NSOperation
中的代码是同步的。 NSOperationQueue
提供了在后台运行代码所需的线程。因此,您将操作添加到队列中,然后队列在后台线程上对您的操作调用start
。
AFJSONRequestOperation
是一种名为NSOperation
的{{1}}特殊类型,这意味着该操作已在内部提供了自己的后台线程。在某些情况下,您可以在队列外调用concurrent
操作的start
方法。因为操作已经提供了它自己的后台线程,所以它仍然会在后台运行。在这种情况下,可以直接调用concurrent
,以最小化示例中显示的代码。
通常,您仍会向start
添加concurrent
次操作,因为您希望利用队列提供的其他功能,例如管理NSOperationQueue
和dependancies
。
所以,只需创建一个maxConcurrentOperationCount
并添加您的操作即可。您不需要调用NSOperationQueue
队列将为您执行此操作。