【问题标题】:NSFetchedResultController, Multithreading and deletion in background threadNSFetchedResultsController,后台线程中的多线程和删除
【发布时间】:2013-12-02 10:00:37
【问题描述】:

主上下文在主队列中工作,单独的操作在单独的线程中工作,上下文由私有队列初始化。一切正常,但发生了一个小问题。

我发现有时当我从后台线程中删除记录时,我在访问 FRC 中的故障对象时遇到异常。似乎当 FRC 处理它获得的条目并且后台线程删除相同的对象时,会发生这种情况。

我应该怎么做才能防止异常发生?我看到的一种解决方案是在托管对象上使用特殊属性来指示它已被(对象)删除。或者我应该以某种方式告诉后台任务在 FRC 完成工作之前不要删除条目。

已编辑:我的代码订阅了 NSManagedObjectContextDidSaveNotification。目标 SDK:iOS 7

主上下文:

- (NSManagedObjectContext *)mainManagedObjectContext
{
if (_mainManagedObjectContext != nil) {
    return _mainManagedObjectContext;
}

_mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_mainManagedObjectContext.persistentStoreCoordinator = [self persistentStoreCoordinator];
return _mainManagedObjectContext;
}

背景背景:

- (NSManagedObjectContext*)newPrivateContext
{
    NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    context.persistentStoreCoordinator = self.persistentStoreCoordinator;
    return context;
}

【问题讨论】:

  • 你能展示你是如何构建主上下文和工作上下文的 - 即父子或观察 NSManagedObjectContextDidSaveNotification。您是否希望这可以在 iOS5 上运行?

标签: objective-c cocoa-touch cocoa core-data nsfetchedresultscontroller


【解决方案1】:

或者我应该以某种方式告诉后台任务在 FRC 完成工作之前不要删除条目。

那是stinky 代码。后台线程不需要知道控制器在做什么。

一个更现代的模式是

- (NSManagedObjectContext*)newPrivateContext
{
    NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    context.parent = self.mainManagedObjectContext;
    return context;
}

然后……

NSManagedObjectContext *workerContext = [self newPrivateContext];

[workerContext performBlock:^{

    //stuff to be done on the background thread

    NSError *error = NULL;
    if ([context save:&error]) {
        //handle error
    }

}];

这项工作将在后台线程上完成,您可以删除对NSManagedObjectContextDidSaveNotification 的观察,因为在两个上下文之间建立父子关系会自动处理。

不确定这是否是您的全部问题,但如果您没有完全正确地使用NSManagedObjectContextDidSaveNotification,可能会导致奇怪的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多