在Core Data管理类中处置NSManagedObjectContexts

时间:2014-03-10 19:11:37

标签: 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;
}

1 个答案:

答案 0 :(得分:2)

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