我有一个方法getSpotifyProductTypeWithSession:(SPTSession *)session
我在viewDidLoad中调用,我希望它下面的代码只在getSpotifyProductTypeWithSession:(SPTSession *)session
完成后执行。我该怎么做呢?这是我的代码。
-(void)viewDidLoad{
SPTAuth *auth = [SPTAuth defaultInstance];
[self getSpotifyProductTypeWithSession:auth.session];
BOOL hasPremium = [[NSUserDefaults standardUserDefaults] boolForKey:@"hasPremium"];
if (hasPremium) {
[FireStarter setSpotifyHasPremium];
} else {
[FireStarter setSpotifyHasFree];
}
}
-(void)getSpotifyProductTypeWithSession:(SPTSession *)session{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[SPTUser requestCurrentUserWithAccessToken:session.accessToken callback:^(NSError *error, SPTUser *user) {
[defaults setBool:NO forKey:@"hasPremium"];
[defaults synchronize];
switch (user.product) {
case SPTProductFree:
[defaults setBool:NO forKey:@"hasPremium"];
[defaults synchronize];
break;
case SPTProductPremium:
[defaults setBool:YES forKey:@"hasPremium"];
[defaults synchronize];
break;
case SPTProductUnlimited:
[defaults setBool:YES forKey:@"hasPremium"];
[defaults synchronize];
default:
break;
}
}];
NSLog(@"%@",[defaults objectForKey:@"hasPremium"]);
}
答案 0 :(得分:1)
为了与执行异步工作和完成块的方法一起使用,您应该在代码中采用相同的方法。所以你可能会声明如下:
-(void)getSpotifyProductTypeWithSession:(SPTSession *)session completion:(void (^)(NSError *))completion {
// ... OP code
[SPTUser requestCurrentUserWithAccessToken:session.accessToken callback:^(NSError *error, SPTUser *user) {
// if there's an error
if (error) completion(error);
// ....more OP code
// at the end
completion(nil); // we're done with no error
}];
}
现在你对此的调用遵循相同的模式......
-(void)viewDidLoad{
SPTAuth *auth = [SPTAuth defaultInstance];
[self getSpotifyProductTypeWithSession:auth.session completion:^(NSError *)error {
BOOL hasPremium = [[NSUserDefaults standardUserDefaults] boolForKey:@"hasPremium"];
// and so on...
}];
答案 1 :(得分:0)
您想要在getSpotifyProductTypeWithSession
方法中添加完成处理程序参数。然后,您可以在完成处理程序中移动代码。让完成处理程序告诉您结果也是有帮助的,这样您就不需要再次检查NSUserDefaults
。
以下是添加的参数:
-(void)getSpotifyProductTypeWithSession:(SPTSession *)session completion:(void (^)(BOOL hasPremium))completion {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[SPTUser requestCurrentUserWithAccessToken:session.accessToken callback:^(NSError *error, SPTUser *user) {
BOOL hasPremium = NO;
switch (user.product) {
case SPTProductFree:
hasPremium = NO;
break;
case SPTProductPremium:
case SPTProductUnlimited:
hasPremium = YES;
break;
}
[defaults setBool:hasPremium forKey:@"hasPremium"];
if (completion) {
completion(hasPremium);
}
}];
}
以下是您的称呼方式:
[self getSpotifyProductTypeWithSession:auth.session completion:^(BOOL hasPremium) {
if (hasPremium) {
[FireStarter setSpotifyHasPremium];
} else {
[FireStarter setSpotifyHasFree];
}
}];
可能存在一些拼写错误。这段代码没有编译和测试,但它给出了这个想法。