gpt4 book ai didi

ios - dispatch_async(dispatch_get_main_queue() inside NSManagedObjectContext performBlock

转载 作者:行者123 更新时间:2023-11-28 18:31:54 25 4
gpt4 key购买 nike

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

这是我的任务

  -(void)doTaskwithCompletion:(coreDataCompletion)complete
{
[self.backgroundManagedObjectContext performBlock:^{

// do my BG core data task

[self saveContext:self.backgroundManagedObjectContext];
complete(YES);

}];
}

这是我的 block 方法

            [[MYCoreDataManager sharedInstance]doTaskwithCompletion:^(BOOL complete) {

if (complete == YES) {

dispatch_async(dispatch_get_main_queue(), ^{

// back to the main thread
});
}

}];

有些东西告诉我这是错误的...但是一旦 block 完成,我找不到另一种方法让自己回到主线程...通知似乎太笨重了。

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

本质上

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

});

}];
}

最佳答案

我猜你知道这是一种非常常见的模式,调用一些异步的东西并在内部返回到 mainQueue,即更新 UI:

dispatch_async(globalQueue, ^{
// do something
dispatch_async(mainQueue, ^{
// update UI
});
});

由于您已经将变量命名为 self.backgroundManagedObjectContext,因此您可能会想到 Multi-Context CoreData我理解你的担忧。只要您不尝试使用此 block 为 CoreData(在任何上下文中)更改某些内容,您可能就没问题。

只需确保为上下文使用正确的初始化程序,即 [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

关于ios - dispatch_async(dispatch_get_main_queue() inside NSManagedObjectContext performBlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com