如何在方法完成后执行一行代码?

时间:2018-02-03 03:17:50

标签: ios objective-c completionhandler

我有一个方法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"]);
}

2 个答案:

答案 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];
    }
}];

可能存在一些拼写错误。这段代码没有编译和测试,但它给出了这个想法。