如何使用CoreData在主线程上仅运行HUD和同步代码块?

时间:2014-07-28 05:17:01

标签: grand-central-dispatch hud

我想要运行一个需要很长时间的块,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]; 
});

1 个答案:

答案 0 :(得分:1)

您在调用+[ProgressHUD show:]后阻止主线程,因此HUD无法显示。在显示HUD&之后,等待一次运行循环迭代。在开始长时间运行的任务之前(使用嵌套的dispatch_async调用)或在后台执行此任务(例如,使用带有私有队列的NSManagedObjectContext)。