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

这是我的任务

  -(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

        });

    }];
   }

最佳答案

“简而言之,我的问题是我可以在moc performBlock:^内调用dispatch_async(dispatch_get_main_queue()吗?”?

答案是肯定的!实际上,当您从主线程调用performBlock时,您正在做相反的事情,对吗?这是iOS的常见功能。一种更清洁的方式可能是通过完成,然后在完成中调用main ...

现在,您有:

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具有对主线程的调用。

10-04 12:58