dispatch_async
システムでユーザーを認証するように、いくつかの方法がリンクされています。
次の非同期メソッドは、それぞれに完了ハンドラーがあるため、前のメソッドが終了したときにのみ発生します。
最後の 1 つが終了したら、2 つのuiview
アニメーション ブロックでカスタム セグエを実行します。
ただし、これらのそれぞれが実際に実行されたときにログに記録すると、ログと実際に発生しているアニメーションの間にかなりのギャップがあり、最終的にビューがアニメーション化し、完了ブロックが呼び出されます。
ここにコードを追加することがどれほど役立つかはよくわかりませんが、テストしたところ、非同期メソッドである必要があります。コメントアウトしてアニメーションを返すだけYES
で、ログと同時に遅延なくアニメーションが発生するためです。
なぜこれが起こるのか誰にも分かりますか?
EDIT *(コード付き)
電子メール、ユーザー、ユーザー 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];
}
}];
}