我想要做的是在后台线程上创建一个异步核心数据任务,这样就不会咀嚼主线程,但我也希望在完成工作后执行主线程工作。
这是我的任务
-(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
});
}
}];我觉得这是不对的..。但是我找不到其他方法让我自己回到主线程上了.通知似乎太笨重了。
我想简单地说,我的问题是我能在moc performBlock:^中调用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
});
}];
}发布于 2014-11-26 21:42:16
“我想简单地说,我的问题是我能否调用dispatch_async(dispatch_get_main_queue()在moc执行块内:^?”
答案是肯定的!事实上,当您从主线程调用您的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()
}];
}其中有一个对主线程的调用。
发布于 2014-11-26 21:51:01
我想您知道,调用某个异步并返回到mainQueue (即更新UI)是一种非常常见的模式:
dispatch_async(globalQueue, ^{
// do something
dispatch_async(mainQueue, ^{
// update UI
});
});由于您已经将变量命名为self.backgroundManagedObjectContext,您可能具有多上下文CoreData的核心,我理解您的关切。只要您不试图用这个块来更改CoreData (在任何上下文上),您可能会很好。
只需确保对上下文使用正确的初始化器,即[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
https://stackoverflow.com/questions/27159200
复制相似问题