Ios 完成一个街区后回来?
给定以下代码:Ios 完成一个街区后回来?,ios,objective-c,core-data,objective-c-blocks,Ios,Objective C,Core Data,Objective C Blocks,给定以下代码: +(Tag *) addNewTagwithName:(NSString *)tagName Error:(NSError **)addError { AppDelegate *delegate = (AppDelegate *) [[UIApplication sharedApplication]delegate]; Tag *newTag = [NSEntityDescription insertNewObjectForEntityForName:@"Tag
+(Tag *) addNewTagwithName:(NSString *)tagName Error:(NSError **)addError {
AppDelegate *delegate = (AppDelegate *) [[UIApplication sharedApplication]delegate];
Tag *newTag = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:delegate.managedObjectContext];
newTag.tagName = tagName;
//no error save to parse
PFObject *tag = [PFObject objectWithClassName:@"Tag"];
tag[@"tagName"] = newTag.tagName;
[tag saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if(error) {
*addError = error;
} else {
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error = nil;
newTag.tagId = tag.objectId;
if(![delegate.managedObjectContext save:&error]) {
*addError = error;
}
});
}
}];
return newTag;
}
有哪些方法可以确保只有在执行newTag.tagId=tag.objectId之后才返回newTag?这是不可能的。因为
addNewTagwithName:
方法立即得到返回,但完成块稍后将执行,并且它不会什么都不做
更新:
尝试下面的代码
+(void) addNewTagwithName:(NSString *)tagName Error:(NSError **)addError completionBlock:(CompletionBlock)comBlock {
//no error save to parse
PFObject *tag = [PFObject objectWithClassName:@"Tag"];
tag[@"tagName"] = tagName;
[tag saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if(error) {
*addError = error;
} else {
dispatch_async(dispatch_get_main_queue(), ^{
comBlock(succeeded,error);
if(![delegate.managedObjectContext save:&error]) {
*addError = error;
}
});
}
}];
}
您的方法调用应该是
CompletionBlock currentTagBlock = ^(BOOL succeeded, NSError *error){
AppDelegate *delegate = (AppDelegate *) [[UIApplication sharedApplication]delegate];
Tag *newTag = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:delegate.managedObjectContext];
newTag.tagName = tagName;
if(!error);
newTag.tagId = tag.objectId;
/* Here you should write your code using tag
ex: [self processWithNewTag:newTag]; */
};
[Tag addNewTagwithName:tagName Error:&addError completionBlock:currentTagBlock];
您已经异步使用了GCD,这意味着您在dispatch_async函数中提供的任务块将在另一个线程上生成,因此您无法控制它何时完成并返回 但在核心数据中成功保存对象后,您可以通过从生成的线程访问主线程异步返回newTag对象。 为此,您必须阅读更多有关GCD的信息。
最好从阅读开始。@Allen你应该重新设计流程。我可以建议或更新我的答案吗?@Allen如果你是块概念的初学者,请花一些时间来理解这一点。你能谈谈
saveinbackgroundithblock吗?
核心数据中的线程安全应该是个问题。你有什么理由以异步方式在后台保存吗?密切相关: