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); } }]; }
我做了一些调查,发现解决这个问题并不难:
我用performBlock
replace了performBlockAndWait
,它工作。
原因很简单: performBlock
是asynchronous的,而performBlockAndWait
是同步的。