NSOperation与完成块

时间:2013-03-15 15:15:29

标签: ios optimization objective-c-blocks nsoperation nsoperationqueue

我有一些图像处理需要花费很多时间和资源,所以我使用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。

我知道我可以设置完成块,但我仍然需要在队列中添加操作。

我想最小化代码中的行号(如果可能的话):)。

1 个答案:

答案 0 :(得分:1)

通常NSOperation中的代码是同步的。 NSOperationQueue提供了在后台运行代码所需的线程。因此,您将操作添加到队列中,然后队列在后台线程上对您的操作调用start

AFJSONRequestOperation是一种名为NSOperation的{​​{1}}特殊类型,这意味着该操作已在内部提供了自己的后台线程。在某些情况下,您可以在队列外调用concurrent操作的start方法。因为操作已经提供了它自己的后台线程,所以它仍然会在后台运行。在这种情况下,可以直接调用concurrent,以最小化示例中显示的代码。

通常,您仍会向start添加concurrent次操作,因为您希望利用队列提供的其他功能,例如管理NSOperationQueuedependancies

所以,只需创建一个maxConcurrentOperationCount并添加您的操作即可。您不需要调用NSOperationQueue队列将为您执行此操作。