在调用另一个方法之前,确保块内的方法完成执行

时间:2013-08-27 22:37:33

标签: iphone ios facebook-graph-api objective-c-blocks

我目前有以下两种方法,第一种方法仅在用户是新用户时调用,并通过将用户首选项保存到云来执行初始设置,第二种方法在每次用户通过执行应用程序时调用基于用户偏好的查询。

[self doInitialSetupsForNewUser]; //Only happens for new user.  Performs query on a block
[self getUserPrefsAndDoStuff]; //For all users

虽然方法getUserPrefsAndDoStuff工作正常,但如果用户是全新的并且必须首先调用设置方法,则无法完成其工作。在doInitialSetupsForNewUser内,我使用块进行以下对Facebook的调用:

FBRequest *request = [FBRequest requestForMe];
[request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        if (!error){ ... }
}];

我的问题是,由于块结构,getUserPrefsAndDoStuff在用户首选项下载并保存在doInitialSetupsForNewUser的块中之前过早调用,因此会提取错误的数据。如何确保设置块在getUserPrefsAndDoStuff之前完成执行。

1 个答案:

答案 0 :(得分:2)

如果您修改doInitialSetupsForNewUser以获取自己的完成块,则很容易做到。它看起来像这样。

- (void)doInitialSetupsForNewUser:(void (^)(BOOL, NSError *))completion
{
    FBRequest *request = [FBRequest requestForMe];
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        if (!error){
            ...
            completion(YES, nil);
        } else {
            completion(NO, error);
        }
    }];
}

然后你只需要更改调用它的代码,这样就可以使用完成块来获取prefs。

if (newUser) {
    [self doInitialSetupsForNewUser:^(BOOL success, NSError *error) {
        if (success)
            [self getUserPrefsAndDoStuff];
        else
            NSLog(@"oh no!  %@", error);
    }];
}
else {
    [self getUserPrefsAndDoStuff];
}