dispatch_async(NSManagedObjectContext performBlock中的dispatch_get_main_queue()

时间:2014-11-26 21:29:34

标签: ios multithreading core-data grand-central-dispatch

我想要做的是在后台线程上创建一个异步核心数据任务,以免咀嚼主线程,但是我也想在完成工作后做主线程工作......

这是我的任务

  -(void)doTaskwithCompletion:(coreDataCompletion)complete
  {
    [self.backgroundManagedObjectContext performBlock:^{

        // do my BG core data task

        [self saveContext:self.backgroundManagedObjectContext];
        complete(YES);

    }];
   }

这是我的阻止方法

            [[MYCoreDataManager sharedInstance]doTaskwithCompletion:^(BOOL complete) {

                if (complete == YES) {

                    dispatch_async(dispatch_get_main_queue(), ^{

                         // back to the main thread                            
                    });
                }

            }];

有些东西告诉我这是错的......但是一旦块完成,我无法找到另一种让自己回到主线程的方法......通知似乎太笨重了。

我想简而言之,我的问题是我可以在dispatch_async(dispatch_get_main_queue()内拨打moc performBlock:^吗?

基本上

  -(void)doTaskwithCompletion:(coreDataCompletion)complete
  {
    [self.backgroundManagedObjectContext performBlock:^{

        // do my BG core data task

        [self saveContext:self.backgroundManagedObjectContext];
        dispatch_async(dispatch_get_main_queue(), ^{

           // back to the main thread    

        });

    }];
   }

2 个答案:

答案 0 :(得分:3)

我想你知道这是一种非常常见的模式,可以调用异步内部,然后回到mainQueue,即更新UI:

dispatch_async(globalQueue, ^{
    // do something
    dispatch_async(mainQueue, ^{ 
        // update UI
    });
});

由于您已经将变量self.backgroundManagedObjectContext命名为Multi-Context CoreData,因此我很了解您的担忧。只要您不想使用此块为CoreData更改某些内容(在任何上下文中),您可能就可以了。

请确保为您的上下文使用正确的初始值设定项,即[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

答案 1 :(得分:2)

“我想简单地说,我的问题是我可以在moc performBlock中调用dispatch_async(dispatch_get_main_queue()吗?^?”

答案是肯定的!事实上,当你从主线程调用你的performBlock时,你正在做那个反转,对吗?这是iOS的常见功能。一个更干净的方法可能是完成,并在完成调用主...

现在,你有:

dispatch_async(dispatch_get_main_queue(), ^{

       // back to the main thread  
       completion()



    });

你也可以写:

-(void)doTaskwithCompletion:(coreDataCompletion)complete
{
[self.backgroundManagedObjectContext performBlock:^{

    // do my BG core data task

    [self saveContext:self.backgroundManagedObjectContext];
    complete()

}];
}

其中complete包含对主线程的调用。