objective-c - MKNetworkKit 和 GCD dispatch_group_t

标签 objective-c ios objective-c-blocks grand-central-dispatch mknetworkkit

我正在尝试使用 MKNetworkKit 从 Web 服务中获取一组链接,然后在后台线程上解析每个响应,并使用 GCD 的 dispatch_group_t 等待所有线程完成处理。我被卡住的地方是我无法弄清楚为什么我的 dispatch_group_notify 没有等待组中的所有线程完成。运行此代码将打印:

results count: 0
added into results, count: 1
added into results, count: 2

调度组没有在等待它的线程。我也试过 dispatch_group_wait 但这让我崩溃了。不知道MKNetworkKit对NSOperation的使用是否与这个问题冲突。感谢您的帮助!

- (MKNetworkOperation *)getABunchOfMovies:(NSArray *)movies onCompletion:(CastResponseBlock)completionBlock onError:(MKNKErrorBlock)errorBlock
{
    MKNetworkOperation *operation;
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    block NSMutableArray *results = [[NSMutableArray alloc] initWithCapacity:[movies count]];

    for (NSString *movieTitle in movies) {
        operation = [self operationWithPath:REQUEST_URL(API_KEY, [movieTitle urlEncodedString])];

        [operation onCompletion:^(MKNetworkOperation *completedOperation) {

            dispatch_group_async(group, queue, ^{
                NSDictionary *response = [completedOperation responseJSON];
                id result = [self processResponse:response withMovieTitle:movieTitle];

                @synchronized (results) {
                    [results addObject:result];
                    NSLog(@"added into results, count: %d", [results count]);
                }
            });
        }
                        onError:^(NSError *error) {
                            errorBlock(error);
                        }];

        [self enqueueOperation:operation];
    }

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        NSLog(@"results count: %d", [results count]);

        // Return array here
        completionBlock(results);
    });

    dispatch_release(group);

    return operation;
}

编辑: 我仍然不明白为什么,但是如果我将其更改为使用 dispatch_group_enter(group);并将其与 dispatch_group_leave(group); 匹配在完成 block 的末尾,它起作用了。有谁知道为什么会这样?

最佳答案

目前 MKNetworkKit 不支持队列完成处理程序。 您应该考虑添加操作依赖项而不是这个 hack。

[lastOperation addDependency:op1];
[lastOperation addDependency:op2];

并假设当“lastOperation”完成时,队列确实已经完成。

另一种方法是 KVO 引擎上的“operationCount”键路径并检查它是否达到零。

MKNetworkEngine 有一个代码块可以显示和隐藏网络事件指示器。

关于objective-c - MKNetworkKit 和 GCD dispatch_group_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11858527/

相关文章:

iphone - NSComparator 在单独的文件中

ios - 当用户通过向上滑动强制退出应用程序时,可操作的推送通知不会出现在装有 iOS 8+ 的设备上

ios - 当我向我的 friend ios xcode 发送邀请时,在 facebook 中看不到通知

iphone - 如何在 iPhone 上制作一个不完全覆盖底层屏幕的新屏幕

ios - 超 View 边框正在切入 subview

ios - iTunes Connect 中用于应用审查的虚拟帐户

ios - 如何在调用 dealloc 后停止运行该 block ? IOS

ios - UIImageJPEGRepresentation 占用大量内存

ios - 如何获取已经实例化的UIViewController?

iphone - 如何在采取行动之前知道几个区 block 是否已经执行完毕?