用的NSOperation块completition(NSOperation with comple

2019-10-17 20:21发布

我有一个要花费很多时间和资源,一些图像处理,所以我用NSOperation + NSOperatioQueue +委托回调。 和所有的工作。

现在我想使用块,因为它更高雅,简单的使用的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。

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

我希望尽量减少在我的代码(如果可能的话:))的行号。

Answer 1:

通常在一个代码NSOperation是同步的。 该NSOperationQueue提供运行在后台的代码所需的线程。 所以,你把你的操作队列和队列然后调用start在后台线程您的操作。

AFJSONRequestOperation是一种特殊类型的NSOperation叫做concurrent ,这意味着操作已经提供了它自己的后台线程内部。 在某些情况下,你可以调用start一个的方法concurrent操作的队列之外。 因为手术已经提供了它自己的后台线程它会在后台运行依旧。 在这种情况下, start可能会直接调用只是为了尽量减少例子所示的代码。

通常情况下,你仍然会增加concurrent操作的NSOperationQueue ,因为你要采取其他的事情队列提供了诸如管理优势dependanciesmaxConcurrentOperationCount

因此,只要自己创建一个NSOperationQueue和您的操作添加到它。 你不会需要调用start队列会为你做到这一点。



文章来源: NSOperation with completition block