обо всем по порядку.Вам не нужно запускать 4 операции, поскольку вы уже находитесь во вторичном потоке и не нуждаетесь в том, чтобы 4 операции выполнялись параллельно.Вы можете просто сделать:
-(void)startDownloads {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self downloadControlAndUpdatePoi];
[self downloadControlAndUpdateItinerari];
[self downloadControlAndUpdateArtisti];
[self downloadControlAndUpdateEventi];
[pool release];
}
Прежде всего, вам нужно определить пул авто-релиза в startDownloads
, если вы используете autorelease
в методах downloadControl*
, в противном случае я подозреваю, что у вас будут утечки.
Относительно того, почему индикатор активности не отображается, это зависит от того, что вы звоните:
[self hideActivityViewer];
сразу после отсоединения.Итак, вы показываете его и удаляете, до того, как пользовательский интерфейс получит время для обновления.Удалите эту строку оттуда и перепишите startDownloads
следующим образом:
-(void)startDownloads {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self downloadControlAndUpdatePoi];
[self downloadControlAndUpdateItinerari];
[self downloadControlAndUpdateArtisti];
[self downloadControlAndUpdateEventi];
[self performSelectorOnMainThread:@selector(hideActivityViewer) withObject:nil waitUntilDone:NO];
[pool release];
}
Здесь обратите внимание, что я звоню в основной поток на hideActivityViewer
, поскольку только основной поток может безопасно использовать UIKit
.РЕДАКТИРОВАТЬ:
Я не знал, что вы использовали Core Data в методах загрузки ...
Посмотрите на Параллельность с Core Data .Вам нужно будет немного подправить свой код, по крайней мере, используя отдельный контекст управляемого объекта для вашего вторичного потока (я не знаю, возможно ли для вас создать moc там).
Также естьпосмотрите на этот урок из Какао - моя подруга .
В качестве альтернативы всему этому вы могли бы подумать:
if (buttonIndex==1) {
[self showActivityViewer];
[self performSelector:@selector(startDownloads) withObject:nil afterDelay:0];
NSLog(@"AGGIORNA");
} else {
NSLog(@"NON AGGIORNARE");
return;
}
с:
-(void)startDownloads {
[self downloadControlAndUpdatePoi];
[self downloadControlAndUpdateItinerari];
[self downloadControlAndUpdateArtisti];
[self downloadControlAndUpdateEventi];
[self hideActivityViewer];
}
Это вообще не использует потоки, но я не уверен, что просмотрщик активности будет отображаться без сбоев.Еще один уровень взлома, если необходимо, и вы можете указать задержку в
[self performSelector:@selector(startDownloads) withObject:nil afterDelay:0.1];