更换场景时停止GCD?

时间:2014-05-22 07:22:00

标签: ios objective-c

我知道不可能停止开始的GCD动作,但我想知道在我已经替换视图后尝试执行时会发生什么,这意味着我有一些GCD函数将图像加载到scrollView,有时候用户想要在他们工作的时候更换场景,我该怎么办呢?或者不应该我?

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^
                   {
                       NSData *imgdata  = [NSData dataWithContentsOfURL:url];
                       UIImage *image=[UIImage imageWithData:imgdata scale:1];

                       dispatch_async(dispatch_get_main_queue(), ^
                                      {

                                                 [UIView transitionWithView:backView
                                                            duration:0.55f
                                                             options:UIViewAnimationOptionTransitionCrossDissolve
                                                          animations:^
                                           {

                                            backView.image=image;

                                           }
                                           completion:nil];


                                      });
                   });
}

1 个答案:

答案 0 :(得分:0)

您可以切换到NSOperation以获得更精确的cancel机制。但如果操作已在进行中,则无法保证取消。作为选项,您可以检查backView是否仍有超级视图。


如果您从superview中删除了一个视图,则不会发生任何动画工作,但转换生命周期的每一步都会发生:

- (void)testUIViewOffScreen
{
    UIWindow *aWindow = [[UIApplication sharedApplication] windows][0];
    UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(10.0, 10.0, 10.0, 10.0)];
    aView.backgroundColor = [UIColor redColor];

    [aWindow addSubview:aView];

    [aWindow layoutIfNeeded];

    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [UIView transitionWithView:aView duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                NSLog(@"Transition will start now");
                 aView.frame = CGRectMake(100.0, 100.0, 100.0, 100.0);
             } completion:^(BOOL finished) {
                 NSLog(@"finished: %@", finished ? @"YES" : @"NO");
             }];
        });
    });

    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];

    [aView removeFromSuperview];

    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate distantFuture]];
}

输出:

23.941 TestCase[70489:60b] Transition will start now
23.942 TestCase[70489:60b] finished: NO