我目前有以下两种方法,第一种方法仅在用户是新用户时调用,并通过将用户首选项保存到云来执行初始设置,第二种方法在每次用户通过执行应用程序时调用基于用户偏好的查询。
[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
之前完成执行。
答案 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];
}