2016-03-15 69 views
0

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

返回总是块之前执行,但如果提交恒等于

我想座返回之前执行。 我该怎么办? 我尝试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; 

} 
+0

为了让你的问题得到正确的答案,请你澄清一下,如果方法checkVerifyCode的调用者线程与线程结果相同:^(){...}块被调用,或者这些线程是不同的。 – DisableR

回答

1

您实际上要求使异步方法同步。并且由于您的checkVerifyCode方法调用位于主线程中,因此需要阻塞主线程(如前所述,这是个不好的主意)。

相反,您应该移动到某个地方,您可以根据异步方法的结果调用更新。

即:

  • 搭建进度指示器和写着“检查你的代码”
  • 修改checkVerifyCode在异步调用的最后返回void
  • 场,地方调用一些方法:

_

[self _checkVerifyDone:commit]; 

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

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

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

这里你的更高层次的目标是什么?看起来您可能正在寻找dispatch_notify_group,但很难从您的问题中得知。我明白你想要解决的问题,但是大局是什么?

0

而不是返回值“提交”像你正在做什么,传递到方法完成块,需要一个“布尔”作为一个参数。然后调用者将能够将代码传递给'verifyCheckCode'并使其异步执行。

相关问题