我想做的是在后台线程上创建异步核心数据任务,以免占用主线程,但我也想在工作完成后进行主线程工作...
这是我的任务
-(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具有对主线程的调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句