我知道它不可能停止开始的 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/