0

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

[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,因此正在提取不正确的数据。如何确保 setup 块在getUserPrefsAndDoStuff.

4

1 回答 1

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);
        }
    }];
}

然后您只需要更改调用它的代码,以便使用完成块来获取首选项。

if (newUser) {
    [self doInitialSetupsForNewUser:^(BOOL success, NSError *error) {
        if (success)
            [self getUserPrefsAndDoStuff];
        else
            NSLog(@"oh no!  %@", error);
    }];
}
else {
    [self getUserPrefsAndDoStuff];
}
于 2013-08-27T22:46:59.373 回答