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吗?
核心数据中的线程安全应该是个问题。你有什么理由以异步方式在后台保存吗?密切相关: