ios - 如何在 iOS 中同步两个异步委托(delegate)方法回调?

标签 ios objective-c protocols

我正在编写一个简单的天气应用程序来巩固我对协议(protocol)和代表的理解。我处于以下情况:

  • 我有 2 个天气数据数据源(此时只有 NSObjects)和一个 View Controller ,一旦我收到来自 的数据,我想更新它。两个来源。
  • 这两个数据源具有我在 View Controller 中遵守的协议(protocol)。一旦他们从自己的 Web 服务接收到数据,就会调用他们的委托(delegate)方法。这可能意味着数据源 1 在数据源 2 之前获取数据,反之亦然,或者同时(不知道 100% 是否可能)
  • 我只想在收到来自两个来源的数据后更新 View 。

  • 最好的方法是什么?我正在考虑嵌套委托(delegate)方法,其中数据源 1 在有数据时会通知数据源 2(通过协议(protocol)),然后让数据源 2 在有数据时通知 View Controller 更新 View 。但是,我认为这不是正确/最佳的做事方式。

    有任何想法吗?

    谢谢

    最佳答案

    这听起来很适合 GCD 调度组。

    首先,使用 dispatch_group_create 创建一个调度组.然后使用 dispatch_group_enter就在您开始请求每项服务之前。调用 dispatch_group_leave当您收到每个服务的响应时。您可以使用 dispatch_group_notify 指定两个请求都完成时要执行的操作。 .

    代码可能如下所示:

    dispatch_group_t weatherGroup = dispatch_group_create();
    
    dispatch_group_enter(weatherGroup);
    [weatherService1 requestWithCompletion:^(Response *response){
        // Do something with the response
        dispatch_group_leave(weatherGroup);
    }];
    
    dispatch_group_enter(weatherGroup);
    [weatherService2 requestWithCompletion:^(Response *response){
        // Do something with the response
        dispatch_group_leave(weatherGroup);
    }];
    
    dispatch_group_notify(weatherGroup, dispatch_get_main_queue(),^{
        // This is executed after both requests are finished
    });
    

    有关详细信息,请参阅文档:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/#//apple_ref/doc/uid/TP40008079-CH2-SW19

    关于ios - 如何在 iOS 中同步两个异步委托(delegate)方法回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27242379/

    相关文章:

    ios - xcode NSInvalidUnarchiveOperationException ,当尝试取消存档文件时

    ios - 对从核心数据中获取的对象进行变音符号敏感排序?

    iphone - 在 Resources 文件夹下添加 iOS 图标和启动图像

    ios - 如何在ios中制作文字阴影

    swift - 协议(protocol)和通用函数中的关联类型使用

    javascript - 使用 Chrome 检测 Windows 8+ 中的自定义协议(protocol)处理程序

    iphone - iOS 中 opengl 顶点数据的对齐有多重要

    ios - NSDateFormatter 上午/下午没有空格

    快速正确使用协议(protocol)扩展

    ios - 多个 NSManagedObjectContexts 问题