0

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];
        }
    }];
}
4

2 に答える 2

1

修理済み!私のコードに次の行を追加したので、今はうまくいっているようです:

dispatch_async(dispatch_get_main_queue(), ^{
    completionBlock(success);
});
于 2012-11-26T01:08:07.260 に答える
0

あなたの説明から、セグエがプロセスの終了を待っているようです。

おそらく、ネストされた非同期メソッドが補完メソッドを介して相互に続くため、やや複雑なコードが生成される可能性があります。これが、ブロッキング方法を見落としている可能性がある理由かもしれません。

コードを整理する 1 つの方法は、シーケンシャル キューを使用することです。キューにプッシュされたブロックは、前のブロックが終了したときにのみ開始されます。

于 2012-11-24T21:19:43.433 に答える