我想做的是在后台线程上创建一个异步核心数据任务,以免占用主线程,但我也想在工作完成后做主线程工作...
这是我的任务
-(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具有对主线程的调用。