ios - 更换场景时停止GCD?

标签 ios objective-c

我知道它不可能停止开始的 GCD 操作,但我想知道在我已经替换 View 后尝试执行时会发生什么,这意味着我有一些 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];


                                      });
                   });
}

最佳答案

你可以切换到NSOperation获得更精确的cancel机制。但它不能保证如果操作已经在进行中它会取消。作为一个选项,您可以检查您的 backView仍然有superview。

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

- (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

关于ios - 更换场景时停止GCD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23800256/

相关文章:

iphone - 如何在特定时间发送短信

ios - NSDictionary 的不区分大小写的键

iphone - 使用 NSRegularExpression 匹配 HTML

objective-c - 滚动后单元格变空。 (X代码)

objective-c - 对象在 iOS5 上被释放,但在 iOS4 上没有。如何追踪?

objective-c - iOS 应用程序中 _class_initialize 中的 semaphore_wait_signal_trap 死锁

ios - 支持两种 iPhone 屏幕尺寸的全屏单元

ios - 使文本字段背景透明,但占位符文本不透明

ios - 细胞上的图像并非一直向左

ios - 有没有办法强制异步 NSURLConnection 在后台调用 connectionDidFinishLoading?