Из контроллера представления в результате действия кнопки мне нужно создать пользовательский объект, который управляет набором асинхронных вызовов удаленных служб, и вызвать метод такого объекта, который запускает эти вызовы служб. Мне нужно, чтобы контроллер представления дождался завершения всех асинхронных сетевых операций, чтобы обновить свое представление. Поскольку сетевые операции являются асинхронными, я не знаю, как я буду связываться с пользовательским объектом, управляющим этими задачами, с контроллером представления, когда все операции будут выполнены.
Вот код, который у меня сейчас есть. Фрагмент кода в контроллере представления выглядит следующим образом (переменная result
в настоящее время не используется):
- (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
, и я уведомляю об окончании connectionDidFinishLoading:
с помощью NSNotificationCenter
(объект loader
прослушивает такие уведомления). Тогда я не знаю, как правильно заставить loader
ждать всех сетевых операций и уведомлять обратно контроллер представления.
заранее спасибо