如何正确使用异步来正确显示HUD是这种方法?

时间:2014-08-13 16:08:26

标签: ios objective-c concurrency grand-central-dispatch hud

并发,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.");

      ...
   }
}

1 个答案:

答案 0 :(得分:3)

您对dispatch_async的第一次调用是使用主队列而不是后台队列。

将其更改为:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{