objective-c - 在 Core Data 管理类中处置 NSManagedObjectContexts

标签 objective-c multithreading core-data frameworks nsmanagedobjectcontext

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

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

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

最佳答案

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

关于objective-c - 在 Core Data 管理类中处置 NSManagedObjectContexts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22309163/

相关文章:

objective-c - 无法在运行时在工作表中编辑 NSTextField

linux - linux内核如何决定下一个线程id

java - 如何以线程安全的方式在 JAX-RS 资源中使用 JerseyClient

ios - 使用 Swift 3 显示来自核心数据的随机数据

objective-c - 从异步 NSURLConnection 更新 NSmenu

iphone - 我的自定义类在 UIViewController 内部损坏,无法跟踪它,没有编译器错误

iphone - iPhone游戏咖啡馆音效

c# - 使用 WPF 数据绑定(bind)设计响应式 UI

ios - 在 SwiftUI 中将 @FetchRequest 与 Core Data 一起使用时修改 nil 排序行为

ios - 将 NSMeasurement 或 NSUnit 存储在 Core Data 中