【发布时间】:2013-08-01 04:03:09
【问题描述】:
从视图控制器中,作为按钮操作的结果,我需要创建一个自定义对象来管理一组异步远程服务调用,并调用触发这些服务调用的此类对象的方法。我需要视图控制器等待所有异步网络操作完成才能更新其视图。由于网络操作是异步的,我不知道在所有操作完成后如何从管理此任务的自定义对象与视图控制器进行通信。
这是我目前拥有的代码。视图控制器中的代码sn-p是这样的(resultvar目前没有使用):
- (void)loadData
{
BOOL __block result = NO;
dispatch_queue_t queue = dispatch_queue_create(dataLoadQueue, NULL);
dispatch_async(queue,^{
Loader *loader = [[Loader alloc] init];
[loader loadData];
dispatch_async(dispatch_get_main_queue(), ^{
if (result) {
// Update view and notify success
}
else {
// Update view and notify error
}
});
});
dispatch_release(queue);
}
这是loader自定义对象端:
- (void)loadData
{
if ([Reachability checkNetStatus]) {
Service1 *service1 = [[Service1 alloc] init];
[service1 callAsyncService];
Service2 *service2 = [[Service2 alloc] init];
[service2 callAsyncService];
// More service calls
}
else {
// Notify network not reachable
}
}
对象service1, service2... serviceN 符合NSURLConnectionDelegate 并且我通过NSNotificationCenter 通知它们已完成connectionDidFinishLoading:(loader 对象正在侦听此类通知)。然后,我不知道让loader 等待所有网络操作并通知视图控制器的正确方法是什么。
提前致谢
【问题讨论】:
-
加载器是否总是创建相同的服务对象集?从您发布的代码中看起来很像,因为 Loader 的 loadData 方法没有参数。
-
@rdelmar 是的,确实如此
标签: ios asynchronous nsurlconnection grand-central-dispatch nsnotificationcenter