并发,GCD,HUD,iOS
一些GCD专家可以告诉我如何改变以下方法,特别是" HUD AREA" ? 当HUD需要上升约45秒时,HUD会闪烁几秒钟 " HUD AREA"代码全部完成。我只需要在这里更正使用GCD(异步)。 NSFetchedResultsControllers在DeepCopy运行期间提供tableView控件,其中Default DB中的新数据(唯一)被移动到用户现有DB中。此代码有效,但在HUD消失后很长时间内NSLog消息继续滚动。我被卡住了。对不起,我在这方面很蹩脚。
非常感谢您阅读此内容,Mark
- (void)loadStore {
if (_store) {return;} // Don’t load store if it’s already loaded
iHungry_MeAppDelegate *appDel = (iHungry_MeAppDelegate*)[[UIApplication sharedApplication] delegate];
BOOL isMigrationNecessary = [self isMigrationNecessaryForStore:[appDel storeURL]];
if (isMigrationNecessary) { // DM Ver upgrade
[self performMigrationForStore:[appDel storeURL]]; // quick
}
BOOL newDataNeedsImporting =
[self isNewDefaultDataAlreadyImportedForStoreWithURL:appDel.storeURL
ofType:NSSQLiteStoreType]; // Data Ver upgrade // quick
if (newDataNeedsImporting) {
/* BEGIN HUD AREA */
[MBProgressHUD showHUDAddedTo:appDel.rootTableViewController.view animated:YES];
dispatch_async(dispatch_get_main_queue(), ^{
[self loadSourceStore]; // quick
[self deepCopyFromPersistentStore:nil]; // LONG
dispatch_async(dispatch_get_main_queue(), ^{
NSDictionary *options =
@{
NSMigratePersistentStoresAutomaticallyOption:@YES
,NSInferMappingModelAutomaticallyOption:@YES
};
NSError *error = nil;
DLog(@"Adding Main Store After DeepCopy");
_store = [_coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:[appDel storeURL]
options:options error:&error];
if (!_store) {NSLog(@"Failed to add store. Error: %@", error);
abort();
}
else{NSLog(@"Successfully added store: %@", _store);
}
[self setNewDefaultDataAsImportedForStore:_store];// in Store's MetaData
[MBProgressHUD hideHUDForView:appDel.rootTableViewController.view animated:YES];
});
});
/* END HUD AREA */
}else{
DLog(@"Normal Non-Upgrade Load.");
...
}
}
答案 0 :(得分:3)
您对dispatch_async
的第一次调用是使用主队列而不是后台队列。
将其更改为:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{