如何在iOS中同步两个异步委托方法回调?

时间:2014-12-02 05:20:52

标签: ios objective-c protocols

我正在撰写一个简单的天气应用,试图巩固我对协议和代表的理解。我遇到以下情况:

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

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

任何想法?

由于

3 个答案:

答案 0 :(得分:5)

这听起来非常适合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

答案 1 :(得分:-1)

您可以使用两个BOOL变量 recievedDataFromServiceOne recievedDataFromServiceTwo 。现在,只要服务返回响应,就设置它们,并在刷新视图之前保持和AND操作进行检查。 UI刷新后重置为

if(recievedDataFromServiceOne && recievedDataFromServiceTwo) {
   //Refesh the UI
}

答案 2 :(得分:-1)

使用在委托方法中递增的计数器属性。所以从0开始计数器,每个委托方法将它递增1.然后你可以在属性的重写setter中观察这个计数器的值(我称之为计数器)

-(void)setCounter:(NSInteger)counter {
    _counter = counter;
    if (_counter == 2) {
        NSLog(@"Both delegates have been called");
        // do your update here
    }
}