在语句之前以相同方法异步执行块

时间:2016-03-15 17:25:37

标签: ios objective-c multithreading grand-central-dispatch

如何在语句之前以相同方法异步执行块?

返回总是在阻塞之前执行,但如果提交总是等于否。

我希望在返回之前执行块。 我该怎么做? 我尝试dispatch_semaphore_t,但checkVerifyCode是主线​​程。 我无法阻止主线程。

-(BOOL)checkVerifyCode
{
__block BOOL commit = NO;
    [SMSSDK commitVerificationCode:self.verificationNum.text phoneNumber:self.phoneNumber.text zone:@"86" result:^(NSError *error) {
        if (error) {
            NSString *errInfo = [error.userInfo objectForKey:@"commitVerificationCode"];
            MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
            [hud setMode:MBProgressHUDModeText];
            [hud setLabelText:@"验证码输入错误"];
            [hud setLabelText:errInfo];

            hud.color = [UIColor clearColor];
            hud.labelColor = [UIColor colorWithRed:118/255.f green:214/255.f blue:255/255.f alpha:0.8f];
            hud.detailsLabelColor = [UIColor colorWithRed:118/255.f green:214/255.f blue:255/255.f alpha:0.8f];
            hud.margin = 10.f;
            hud.yOffset = -100.f;
            hud.removeFromSuperViewOnHide = YES;
            [hud hide:YES afterDelay:3];
            NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:commit] forKey:@"bool"];
            [self performSelectorOnMainThread:@selector(setCommit:) withObject:dict waitUntilDone:NO];

        }else
        {
            NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:commit] forKey:@"bool"];
            [self performSelectorOnMainThread:@selector(setCommit:) withObject:dict waitUntilDone:NO];
            commit = YES;
        }
    }];
return commit;

}

3 个答案:

答案 0 :(得分:1)

您实际上是在要求使异步方法同步。因为你对checkVerifyCode方法的调用是在主线程上,所以需要阻塞主线程(如上所述,这是个坏主意)。

相反,你应该转向某个方法,你可以调用它来根据异步方法的结果进行更新。

即:

  • 设置进度指示器和一个显示"检查代码"
  • 的字段
  • 修改checkVerifyCode以返回void
  • 在异步调用结束时,在某处调用某个方法:

_

 [self _checkVerifyDone:commit];

而且,如果你真的需要它在主队列上:

dispatch_async(dispatch_get_main_queue(), ^{
    [self _checkVerifyDone:commit];
});

答案 1 :(得分:0)

您可以将整个函数分派到单独的队列,然后使用dispatch_semaphore阻止该队列,直到返回结果。

你的高级目标是什么?似乎dispatch_notify_group可能是您正在寻找的东西,但很难从您的问题中看出来。我理解你要解决的问题,但是大局是什么?

答案 2 :(得分:0)

而不是返回值' commit'就像你现在正在做的那样,将方法转移到一个完成块中,该块需要一个' bool'作为参数。然后调用者就能将代码传递给' verifyCheckCode'并让它异步执行。