Я использую GCD для фоновой загрузки в моем приложении Tab Bar.
Первый шаг — выполнить фоновую загрузку в -viewWillAppear:
(чтобы настроить некоторые основные данные перед загрузкой представления).
Второй шаг — остальная часть фоновой загрузки в -viewDidAppear:
По какой-то причине блок отправки в -viewDidAppear:
вызывается перед блоком отправки в -viewWillAppear:
.
Происходит это только один раз после загрузки приложения при первом переходе на вкладку с фоновыми методами GCD. Переключение на другую вкладку, а затем обратное переключение на вкладку с фоновыми методами GCD. Третий (и все последующие разы) раз, когда я переключаюсь обратно, он работает как положено (сначала -viewWillAppear:
срабатывание, а затем -viewDidAppear:
).
Вот выдержки из моего кода (-viewWillAppear:
и -viewDidAppear:
):
-viewWillAppear:
- (void)viewWillAppear:(BOOL)animated {
DLog(@"viewWillAppear method running");
[super viewWillAppear:animated];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
[self setDiskCareerIds:[CareersParser idsFrom:@"disk"]];
[self setDownloadedCareerIds:[CareersParser idsFrom:@"web"]];
DLog(@"diskCareerIds after being set in viewWillAppear: %@", [self diskCareerIds])
DLog(@"downloadedCareerIds after being set in viewWillAppear: %@", [self downloadedCareerIds])
if ([[self downloadedCareerIds] isEqualToArray:[self diskCareerIds]]) {
DLog(@"viewWillAppear: ids equal, loading careers from disk.");
self.careers = [CareersParser loadCareersFromDisk];
dispatch_async(dispatch_get_main_queue(), ^{
[self.table reloadData];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
});
}
});
//[self downloadData];
}
-viewDidAppear:
- (void)viewDidAppear:(BOOL)animated {
DLog(@"viewDidAppear method running");
[super viewDidAppear:animated];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
if (![[self downloadedCareerIds] isEqualToArray:[self diskCareerIds]]) {
DLog(@"ids not equal, saving careers to disk.");
dispatch_async(dispatch_get_main_queue(), ^{
[self showLoadingView];
});
[CareersParser saveCareersToDisk];
self.careers = [CareersParser loadCareersFromDisk];
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.table reloadData];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[self removeLoadingView];
});
});
//[self download3];
//[self downloadData];
}
Просмотрите журнал отладки на странице Pastie.