我正在撰写一个简单的天气应用,试图巩固我对协议和代表的理解。我遇到以下情况:
最好的方法是什么?我正在考虑嵌套委托方法,其中数据源1在有数据(通过协议)时通知数据源2,然后让数据源2通知视图控制器在有数据时更新视图。但是我不认为这是做事的正确/最佳方式。
任何想法?
由于
答案 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
});
答案 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
}
}