在同一方法中的语句之前异步执行一个块
Execute a block asynchronously before statement in same method
如何在同一方法中异步执行语句之前的块?
return总是在块之前执行,但是如果提交总是等于No.
我希望块在 return 之前执行。
我该怎么做?
我尝试 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;
}
您可以将整个函数分派到一个单独的队列,然后使用 dispatch_semaphore
阻塞该队列,直到返回结果。
您的更高层次目标是什么? dispatch_notify_group
似乎是您要查找的内容,但很难从您的问题中判断出来。我了解您要解决的问题,但总体情况如何?
您实际上是在要求使异步方法同步。由于您对 checkVerifyCode
方法的调用是在主线程上进行的,因此这将需要阻塞主线程(如前所述,这是个坏主意)。
相反,您应该在某个地方使用一些方法,您可以根据异步方法的结果调用这些方法来进行更新。
即:
- 设置进度指示器和一个显示 "Checking your code"
的字段
- 将
checkVerifyCode
修改为return void
和
- 在异步调用结束时,在某处调用一些方法:
_
[self _checkVerifyDone:commit];
而且,如果你真的需要它在主队列中:
dispatch_async(dispatch_get_main_queue(), ^{
[self _checkVerifyDone:commit];
});
而不是像您当前所做的那样 return 值 'commit',而是将一个以 'bool' 作为参数的完成块传递给该方法。然后调用者可以将代码传递给 'verifyCheckCode' 并让它异步执行。
如何在同一方法中异步执行语句之前的块?
return总是在块之前执行,但是如果提交总是等于No.
我希望块在 return 之前执行。
我该怎么做?
我尝试 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;
}
您可以将整个函数分派到一个单独的队列,然后使用 dispatch_semaphore
阻塞该队列,直到返回结果。
您的更高层次目标是什么? dispatch_notify_group
似乎是您要查找的内容,但很难从您的问题中判断出来。我了解您要解决的问题,但总体情况如何?
您实际上是在要求使异步方法同步。由于您对 checkVerifyCode
方法的调用是在主线程上进行的,因此这将需要阻塞主线程(如前所述,这是个坏主意)。
相反,您应该在某个地方使用一些方法,您可以根据异步方法的结果调用这些方法来进行更新。
即:
- 设置进度指示器和一个显示 "Checking your code" 的字段
- 将
checkVerifyCode
修改为returnvoid
和 - 在异步调用结束时,在某处调用一些方法:
_
[self _checkVerifyDone:commit];
而且,如果你真的需要它在主队列中:
dispatch_async(dispatch_get_main_queue(), ^{
[self _checkVerifyDone:commit];
});
而不是像您当前所做的那样 return 值 'commit',而是将一个以 'bool' 作为参数的完成块传递给该方法。然后调用者可以将代码传递给 'verifyCheckCode' 并让它异步执行。