通过MagicalRecords在不同的线程中使用NSManagedObject

nul*_*ion 2 core-data ios magicalrecord

我在主线程中创建实体Artist,然后在后台线程中传递它并与实体相册相关联.

怎么做正确?

- (IBAction)add:(id)sender
{
    Artist *artist = [Artist MR_createEntity];
    artist.title = @"Eminem";

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
        // here a large calculation
        Album *album = [Album MR_createEntity];
        album.title = @"Album 1";
        [artist setAlbums:[NSSet setWithArray:@[album]]];

        dispatch_async(dispatch_get_main_queue(),^{
            [artist.managedObjectContext MR_saveToPersistentStoreAndWait];
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

错误:

MagicalRecordTest[2008:1803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'albums' between objects in different contexts (source = <Artist: 0x15eaa2d0>
Run Code Online (Sandbox Code Playgroud)

Mar*_*rra 5

您违反了Core Data的主要规则之一.A NSManagedObjectContext及其关联NSManagedObject实例只能在创建它们的线程上访问.您可以传递NSManagedObjectID实例但不传递NSManagedObject实例.

此外,当您在两个NSManagedObject实例之间创建关系时; 两个实例必须是相同的,NSManagedObjectContext否则你将得到你在上面看到的错误.

而不是上面的方法,重新获取Artist块中的内容.我可以提供有关如何使用Core Data执行此操作的示例代码,但您需要研究如何使用MagicalRecord执行此操作.