我知道不可能停止开始的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];
});
});
}
答案 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