Coredata performBlock然后返回新的值

如果我使用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; 

这里既然保存发生在块中,返回将首先执行。 但是我需要具有最新价值的object 。 任何build议请。

不是返回新创build的Core Data对象,而是使用正在创build的对象types的parameter passing构造方法块。

在Managed Object Context的performBlock: block中创build对象时,调用您的completion块并传入新构build的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); } }]; } 

我做了一些调查,发现解决这个问题并不难:

我用performBlockreplace了performBlockAndWait ,它工作。

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