在核心数据管理类中处理 NSManagedObjectContexts

Posted

技术标签:

【中文标题】在核心数据管理类中处理 NSManagedObjectContexts【英文标题】:Disposing of NSManagedObjectContexts in a Core Data management class 【发布时间】:2014-03-10 19:11:37 【问题描述】:

所以我正在制作一个框架来保存用于操作核心数据数据库的所有代码。我最终遇到的问题是这个。

我有一个返回新项目的方法

- (NSManagedObject *)createItem;

一旦他们修改了该项目就会调用

- (void)save;

这必须能够在多个线程中执行,因此我从方法返回的托管对象必须在线程内具有一致的 NSManagedObjectContext。我的解决方案是创建一个 NSMutableDictionary 来保存对 NSManagedObjectContexts 的引用,使用

[NSThread hash]

作为关键。这很好用。唯一的问题是,一旦它们的线程完成,我就无法摆脱上下文。

有人知道我如何检测到这一点吗?

这是我的托管对象上下文方法的代码

// Return Managed Object Context for Framework
- (NSManagedObjectContext *)managedObjectContext

    // Get Thread Hash Value
    NSThread * currentThread = [NSThread currentThread];
    NSNumber * hashValue = [NSNumber numberWithUnsignedInteger:[currentThread hash]];

    // Get Context From Thread Hash
    NSManagedObjectContext * context = [self.managedObjectContexts objectForKey:hashValue];

    // Check Context Exists
    if (!context)
    
        // Create Managed Object Context With Persistent Store Coordinator In Main Thread
        NSPersistentStoreCoordinator * coordinator = [self persistentStoreCoordinator];
        if (coordinator != nil) 
            context = [[NSManagedObjectContext alloc] init];
            [context setPersistentStoreCoordinator:coordinator];
        

        // Add Context To Available Contexts
        [self.managedObjectContexts setObject:context forKey:hashValue];
    

    // Return
    return context;

【问题讨论】:

【参考方案1】:

查看使用每个NSThread 上可用的threadDictionary。通过这种方式,您可以轻松获取线程的 MOC(或知道是否没有),并且将为您处理清理工作。

【讨论】:

Dang 不知道它的存在我会试试这个,让你知道你可能刚刚挽救了一天。 一个流行的实现例子,见github.com/magicalpanda/MagicalRecord/blob/…中的MR_contextForCurrentThread @magma:MR_contextForCurrentThread 已被弃用,请参阅 MagicalRecord 的作者的这篇文章:***.com/a/20536335/1187415。 @MartinR 出色的评论,非常感谢。我没有意识到这一点。

以上是关于在核心数据管理类中处理 NSManagedObjectContexts的主要内容,如果未能解决你的问题,请参考以下文章

核心数据模型对象保存的最佳实践

所有实例属性的核心数据总和

核心数据一对多关系

NSManagedObjectContext,声明在哪里?

Swift NSFetchedResultsController 嵌套对象的最佳实践

xcode核心数据类中的数据类型不匹配