ios - 在 For 循环之后添加具有依赖项的 NSOperation

标签 ios facebook multithreading graph nsoperation

所以我试图在所有 block 操作之后执行 lastOperation,但由于某种原因它首先被执行。为什么是这样?添加依赖项的方法是错误的吗?

[self facebookAccount:^(NSError *error, ACAccount *facebookAccount) {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue setMaxConcurrentOperationCount:1];
    NSBlockOperation *lastOperation = [NSBlockOperation blockOperationWithBlock:completionAll];
    for (NSString *postID in postIDs) {
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
            NSString *postIDString = [NSString stringWithFormat:@"https://graph.facebook.com/v2.0/%@", postID];
            NSURL *postIDURL = [NSURL URLWithString:postIDString];
            SLRequest *postIDRequest = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:postIDURL parameters:nil];
            postIDRequest.account = facebookAccount;

            [postIDRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                NSError *parseError;
                NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:&parseError];

                completion(response);
            }];

        }];
        [queue addOperation:operation];
        [lastOperation addDependency:operation];
    }

    [queue addOperation:lastOperation];

}];

如果我在 [self facebookAccount:^(NSError *error, ACAccount *facebookAccount)] 中添加以下代码:

[RACObserve(queue, operationCount) subscribeNext:^(id x) {
        NSLog(@"Operation count for queue: %@", x);
    }];

然后输出到控制台是:

http://i.imgur.com/efrouOC.png (抱歉我不能发图片,但我会尽快提高我的声誉)

“全部完成”的位置通常在 5 到 10 之间变化。所以我很确定这取决于哪些 NSOperations 在队列到达 lastOperation 之前完成处理 GET 请求。

最佳答案

我猜 performRequestWithHandler: 会立即返回,因为它需要一个回调 block 作为它的参数。一旦 NSBlockOperation 的 block 返回,该操作就被认为已完成,因此您的所有操作都会立即完成,并且只会在稍后调用它们的完成 block 。

您可能需要继承 NSOperation 并实现并发方法(至少:startisConcurrentisExecutingisFinished) 而不是非并发方法(最小值:main)。来自 performRequestWithHandler: 的回调应该触发状态相关属性的键值通知,以指示 NSOperation 已完成。

关于ios - 在 For 循环之后添加具有依赖项的 NSOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24515017/

相关文章:

Facebook、谷歌和我自己的身份验证的数据库模式

c++ - 将参数传递给 boost::thread 中的函数

iphone - 切换到基础国际化

iOS 验证失败 -> bundle 无效(Xcode 6.2、iOS 8.2)

iphone - 当应用程序已经上传时,ios 更改标签 itunesconnect

Android Facebook-SDK

php - Facebook 分享器

iOS - 如何在 BLE 外围设备上发现未公布的服务

c++ - 使用 pthread 同时 push() 到共享队列?

java - 让同一台机器上的客户端运行在不同的线程上