首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅在方法完成后执行一行代码?

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

Stack Overflow用户
提问于 2018-02-03 11:17:50
回答 2查看 85关注 0票数 0

我有一个在viewDidLoad中调用的方法getSpotifyProductTypeWithSession:(SPTSession *)session,我希望它下面的代码只在getSpotifyProductTypeWithSession:(SPTSession *)session完成后执行。我该怎么做呢?下面是我的代码。

代码语言:javascript
复制
-(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"]);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-03 12:56:11

您希望将完成处理程序参数添加到getSpotifyProductTypeWithSession方法中。然后,您可以将代码移动到完成处理程序中。让完成处理程序告诉您结果也会有所帮助,这样您就不需要再次检查NSUserDefaults

下面是添加的参数:

代码语言:javascript
复制
-(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);
        }
    }];
}

下面是你怎么称呼它的:

代码语言:javascript
复制
[self getSpotifyProductTypeWithSession:auth.session completion:^(BOOL hasPremium) {
    if (hasPremium) {
        [FireStarter setSpotifyHasPremium];
    } else {
        [FireStarter setSpotifyHasFree];
    }
}];

可能会有一些打字错误。这段代码没有经过编译和测试,但它给出了想法。

票数 0
EN

Stack Overflow用户

发布于 2018-02-03 12:54:31

为了更好地使用执行异步工作和获取完成块的方法,您应该在代码中采用相同的方法。因此,您可能会声明如下内容:

代码语言:javascript
复制
-(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
    }];
}

现在您对此的调用遵循相同的模式...

代码语言:javascript
复制
-(void)viewDidLoad{
    SPTAuth *auth = [SPTAuth defaultInstance];
    [self getSpotifyProductTypeWithSession:auth.session completion:^(NSError *)error {
        BOOL hasPremium = [[NSUserDefaults standardUserDefaults] boolForKey:@"hasPremium"];
       // and so on...
    }];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48593592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档