我dispatch_async
链接了几种方法,因此它们对我系统中的用户进行身份验证。
下一个异步方法仅在前一个完成时发生,因为它们每个都有完成处理程序。
最后一个完成后,我使用 2 个uiview
动画块执行自定义转场。
但是,当我记录每个实际运行时,日志和实际发生的动画之间存在相当大的差距,最终视图动画和完成块被调用。
我真的不知道在此处添加我的代码会有多大用处,但我已经测试过,它必须是异步方法,因为如果我将它们注释掉并且只是返回YES
动画,那么动画就会与日志同时发生而不会延迟。
有谁知道为什么会发生这种情况?
编辑 *(带代码)
用于电子邮件、用户、用户 ID 的典型“存在检查”。
- (void)existsInSystemWithCompletionHandler:(void (^)(BOOL))block
{
self.existsInSystem = NO;
if (self.isValid) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//
// Get data
//
if (dataIsValid) {
block(YES);
} else {
block(NO);
}
});
} else {
block(self.existsInSystem);
}
}
检查用户是否存在
[potentialUser existsInSystemWithCompletionHandler:^(BOOL success) {
if (success) {
// Perform segue
//
[self performSegueWithIdentifier:@"Logging In" sender:self];
}
}];
转场
- (void)perform
{
NSLog(@"Perform");
LogInViewController *sourceViewController = (LogInViewController *)self.sourceViewController;
LoggingInViewController *destinationViewController = (LoggingInViewController *)self.destinationViewController;
destinationViewController.user = sourceViewController.potentialUser;
// Animate
//
[UIView animateWithDuration:0.2f
animations:^{
NSLog(@"Animation 1");
//
// Animate blah blah blah
//
}];
[UIView animateWithDuration:0.4f
delay:0.0f
options:UIViewAnimationOptionCurveEaseIn
animations:^{
NSLog(@"Animation 2");
//
// Animate blah blah blah
//
}
completion:^(BOOL finished) {
NSLog(@"Completion");
//
// Finished
//
[sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
}];
}
登录VC
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.user loginWithCompletionHandler:^(BOOL success) {
if (success) {
[self performSegueWithIdentifier:@"Logged In" sender:self];
}
}];
}