我想要做的是在后台线程上创建一个异步核心数据任务,以免咀嚼主线程,但是我也想在完成工作后做主线程工作......
这是我的任务
-(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
});
}];
}
答案 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包含对主线程的调用。