【问题标题】:How to call a method once the completion block finish?完成块完成后如何调用方法?
【发布时间】:2016-08-25 06:44:22
【问题描述】:

我想先调用signUp方法,一旦我得到userID,我需要调用另一个方法normalSignupMethod

[ConnectionObj signUp:user];
[helper normalSignupMethod:dict];

注册方法:

[MYRequest signUp:user successBlock:^(QBResponse *response, QBUUser *user) {
    // Sign up was successful
    // Store user id
    [SingletonClass sharedMySingleton].userID = [NSString stringWithFormat:@"%@",response.data[@"id"]];   

} errorBlock:^(QBResponse *response) {
    // Handle error here
    NSLog(@" error in creating session %@", response.error);
    [SVProgressHUD showErrorWithStatus:NSLocalizedString(@"SignUp to Chat error!", nil)];
}];

这就是我所说的:

dispatch_group_t group = dispatch_group_create(); 
       dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
    NSLog(@"Block1");
    [ConnectionObj signUp:user];
});

dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {

    NSLog(@"Group notify");
    [helper normalSignupMethod:dict];
    dispatch_async(dispatch_get_main_queue(), ^{
        [SVProgressHUD dismiss];
    });
});

首先执行块 1,然后调用组通知。但是在 normalSignupMethod 完成后,我得到了用户 ID。如何在调用 normalSignupMethod 之前等待 signUp 方法获取 userID?

【问题讨论】:

  • 为什么要引入意外的复杂性而不使用委托?如果您使用委托,则不会出现此问题。
  • 您尝试过使用dispatch_group_enterdispatch_group_leave 吗?这样它就等待第一次执行完成
  • 您没有包含signUp: 方法的定义。您指定了signUp:successBlock:errorBlock:,它为您提供了一个挂钩,可以完全按照您想要的目的调用块中的其他内容。 @suhit 和 @ndoc 基本上会告诉你怎么走。做任何派遣的事情让我觉得很奇怪,跟随他们的领导

标签: ios objective-c multithreading block


【解决方案1】:

您可以像这样使用signUp 方法创建block,并传递Bool 完成值来检查它是否成功调用。所以像这样改变你的方法声明。

-(void)signUp:(QBUser*)user andHandler:(void (^)(BOOL result))completionHandler;

及其定义

-(void)signUp:(QBUser*)user andHandler:(void (^)(BOOL result))completionHandler {
    [MYRequest signUp:user successBlock:^(QBResponse *response, QBUUser *user) {
        [SingletonClass sharedMySingleton].userID = [NSString stringWithFormat:@"%@",response.data[@"id"]];   
        completionHandler(YES);
    } errorBlock:^(QBResponse *response) {
       // Handle error here
        NSLog(@" error in creating session %@", response.error);
        [SVProgressHUD showErrorWithStatus:NSLocalizedString(@"SignUp to Chat error!", nil)];
        completionHandler(NO);
    }];
}

现在像这样调用这个方法。

[ConnectionObj signUp:user andHandler:^(BOOL result) {
    if(result) {
        [helper normalSignupMethod:dict];
    }
}];

【讨论】:

    【解决方案2】:

    一旦signUp:successBlock 请求返回到successBlock,您就可以调用normalSignupMethod

    [MYRequest signUp:user successBlock:^(QBResponse *response, QBUUser *user) {
            // Sign up was successful
            // Store user id
            [SingletonClass sharedMySingleton].userID = [NSString stringWithFormat:@"%@",response.data[@"id"]]; 
    
            //call the signup method 
            [helper normalSignupMethod:dict];
    
        } errorBlock:^(QBResponse *response) {
            // Handle error here
            NSLog(@" error in creating session %@", response.error);
            [SVProgressHUD showErrorWithStatus:NSLocalizedString(@"SignUp to Chat error!", nil)];
        }];
    

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      相关资源
      最近更新 更多