Coredata performBlock然后返回新值

时间:2015-11-06 09:34:42

标签: ios objective-c core-data nsmanagedobjectcontext nsthread

如果我使用performBlock保存managedObjectContext,如何返回保存在coredata中的新对象?

要求是,在coredata中添加一个条目,然后将其返回。我的代码是这样的:

//create a privateMOC
NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

//set parentContext
[private setParentContext:self.coredataManager.managedObjectContext];

__block Detail *object = nil;

[private performBlock:^{
    //fetch from the db
    object = [self.coredataManager insertObjectWithEntityName:NSStringFromClass([Detail class])];

    //save the private context
    NSError *error = nil;
    if (![private save:&error]) {
        NSLog(@"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
    }

}];

return object;

由于保存发生在Block中,因此返回将首先执行。但是我需要具有最新值的object。有任何建议请。

2 个答案:

答案 0 :(得分:4)

不是返回新创建的Core Data对象,而是将构造函数方法传递给一个带有您正在创建的对象类型的参数的块。

在托管对象上下文的performBlock:块中创建对象后,调用completion块并传入新构建的Core Data对象。

+ (void)coreDataObjectWithJSON:(NSDictionary *)json completion:(void (^)(NSYourCoreDataObject *coreDataObject))completion {

    [yourManagedObjectContext performBlock:^{

        NSEntityDescription *entity = [NSEntityDescription entityForName:... inManagedObjectContext:...];

        NSYourCoreDataObject *coreDataObject = [[NSYourCoreDataObject alloc] initWithEntity:entity insertIntoManagedObjectContext:...];

        if (completion) {
            // "return" the new managed object
            completion(coreDataObject);
        }
    }];
}

答案 1 :(得分:1)

我做了一些研究,发现解决这个问题并不困难:

我将performBlock替换为performBlockAndWait并且有效。

原因很简单:performBlock是异步的,而performBlockAndWait是同步的。