如何在语句之前以相同方法异步执行块?
返回总是在阻塞之前执行,但如果提交总是等于否。
我希望在返回之前执行块。
我该怎么做?
我尝试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 :(得分: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'并让它异步执行。