0

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

2 回答 2

1

固定的!现在似乎可以在我的代码中添加以下行:

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

从您的描述看来,您的 segue 可能正在等待一个过程完成。

也许您的嵌套异步方法通过它们的完成方法相互跟随,从而产生了一些令人费解的代码。这可能是您可能忽略阻塞方法的原因。

整理代码的一种方法是使用顺序队列。推送到队列中的块只有在前一个完成后才会开始。

于 2012-11-24T21:19:43.433 回答