如果我使用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
。有任何建议请。
答案 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
是同步的。