使用MagicalRecord进行NSOperations - CoreData无法解决问题

时间:2014-08-21 17:55:17

标签: ios core-data nsmanagedobjectcontext nsoperation magicalrecord

我有一个NSOperationQueue根据猫的喜好生成猫玩具。操作定义如下:

- (void)main {
    @autoreleasepool {

        self.context = [NSManagedObjectContext MR_context];

        Cat *cat = (Cat*)[self.context objectWithID:self.objectId];

        CatToyMaker *toyMaker = [[CatToyMaker alloc] init];
        [toyMaker toysForPrefs:cat.prefs completion:^(NSDictionary *toys) {
            [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
                cat.toys = toys;
            }];
        }];

    }
}

我知道这不是很正确。事实上我遇到了这样的崩溃:

*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x176338e0 <x-coredata://3FDAE17B-0998-4AB2-B5B8-4F94D6CE9C05/Cat/p226>''

在完成区中将玩具保存到猫实体的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你需要:

  • 仅在该操作中使用单个上下文
  • 在该上下文中刷新对象引用
  • 仅在该上下文中保存您的更改。

你有前两个步骤,但你的最后一步是保存不同的上下文,因此导致问题。试试这个:

- (void)main 
{
    @autoreleasepool {

        self.context = [NSManagedObjectContext MR_context];

        Cat *cat = [self.context objectWithID:self.objectId];

        CatToyMaker *toyMaker = [[CatToyMaker alloc] init];
        [toyMaker toysForPrefs:cat.prefs completion:^(NSDictionary *toys) {
            cat.toys = toys;
            [self.context MR_saveToPersistentStoreAndWait];
        }];

    }
}