我想要运行一个需要很长时间的块,1分钟。我想要一个HUD向用户显示正在进行处理。用户在处理期间不使用该接口。以下代码是我失败的尝试。 HUD没有出现,处理没有完成/运行。我看到下面的代码块完成然后CoreData工作,NSFetchedResultsController,NSNotification东西响应主MOC的变化。基本上,我希望主线程只运行块和HUD。
dispatch_sync(dispatch_get_main_queue(), ^{
[ProgressHUD show:@"Migrating data..."];
// version update run, move any new data from new sourceDB to user's current DB
[self loadSourceStore];
[self deepCopyFromPersistentStore:nil];
[ProgressHUD dismiss];
});
这会在屏幕上显示HUD,宣布长时间运行,HUD停止使用界面。
我该怎么做?非常感谢阅读,Mark
我接受了尼古拉的回答。我无法格式化我的解决方案,所以我在这里提供 这对我有用:
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:appDel.rootTableViewController.tableView animated:YES];
hud.labelText = @"Migrating data...";
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
dispatch_after(popTime, concurrentQueue, ^(void){
// long run code here //
[MBProgressHUD hideHUDForView:appDel.rootTableViewController.tableView animated:YES];
});
答案 0 :(得分:1)
您在调用+[ProgressHUD show:]
后阻止主线程,因此HUD无法显示。在显示HUD&之后,等待一次运行循环迭代。在开始长时间运行的任务之前(使用嵌套的dispatch_async
调用)或在后台执行此任务(例如,使用带有私有队列的NSManagedObjectContext
)。