首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:运行代码会阻止其他代码直到完成

Swift:运行代码会阻止其他代码直到完成
EN

Stack Overflow用户
提问于 2018-06-16 03:09:40
回答 1查看 248关注 0票数 0

我在ViewDidAppear中调用一个动画,稍后在ViewDidAppear中调用一个函数,该函数创建几个UIImage对象数组,完成时间为4-5秒。

同时,动画只有0.8秒长,并且有一个完成块:

代码语言:javascript
复制
UIView.animate(withDuration: 0.8, delay: 0.0, options: UIViewAnimationOptions(), animations: {
            self.myView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        }, completion: { finished in
            self.nextTask()
        })

问题是,完成块不会在0.8秒后运行--直到前面的代码完成之后才会运行。

除了在后台线程中使用DispatchQueue.global(qos: .background).async运行代码之外,还有什么可以做的吗?还是有办法提高后台线程的完成速度?

如果在后台线程中完成的话,我的动画不会中断,但是在后台完成需要花费更长的时间--比如20-30秒,而不是4-5秒。

谢谢您的帮助,您可以在这里分享!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-16 04:26:51

我正在调用一个函数,该函数创建多个UIImage对象数组,需要4-5秒才能完成。

你绝对不能在主线程上运行它。在现代设备上,刷新帧为1/120秒。你不能使框架丢失。在发生这种情况时,您正在阻止用户交互。屏幕将被冻结,看门狗进程将当场杀死你的应用程序。(不幸的是,模拟器没有向您展示这一点,也没有在设备上运行Xcode;但是如果您在设备上运行应用程序,停止它,并从设备上运行它,而不是从Xcode运行它,您将明白我的意思。)

问题是,完成块不会在0.8秒后运行--直到前面的代码完成之后才会运行。

正如你所推测的,这里有一个重新进入的问题。您需要离开主线程,以允许完成块发生。我实际上很惊讶动画竟然开始了(是吗?)当您仍然在主线程上运行代码时,什么都不会发生。

您可以使用较短的延迟调用async_after,使其暂时跳出主线程,然后重新输入它,足够长的时间允许刷新帧发生,因此系统可以完成一些工作。但这只是让动画开始的一种方式。一旦你回到主线程,你将再次阻塞它。

至于速度:.background的QOS是最慢的选择,所以你得到了你想要的东西。但是,通常情况下,不要使用全局队列;创建自己的队列。我无法想象你所做的事情会花这么长时间,也许这就是你真正应该问的问题,但你绝对不能在主线程上这样做。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50884634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档