Ios 更换场景时停止GCD?

Ios 更换场景时停止GCD?,ios,objective-c,Ios,Objective C,我知道不可能停止已启动的GCD操作,但我想知道在我已经替换视图后,当它尝试执行时会发生什么情况,这意味着我有一些GCD函数,可以将图像加载到scrollView,有时用户希望在工作时替换场景,我应该如何停止它?或者我不应该 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ { NSData

我知道不可能停止已启动的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];


                                      });
                   });
}

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


如果从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

所以我只想知道,如果我已经被一个视图取代,他无论如何都会尝试执行任务吗?@Curnelious一些测试可能会有所帮助