Swift UIAnimation被for循环阻止

问题描述

我有一个UIAnimation可以提取消息日志,但是我也需要使用for循环来填充消息日志。我在for循环开始之前进行了动画制作,但是,直到for循环完成执行之后,动画才真正开始(即使循环位于UIAnimation之后)。

我尝试将for循环的内容放入autoreleasepool中(没有用)

我尝试在后台线程上运行for循环,但是,循环中的大多数代码都需要在主线程上执行,而这种方法还没有成功。

for循环非常大,大多数代码与问题无关,因此您可以使用任何UIAnimation以及任何相对耗时的for循环进行设置...

例如:

let someView = UIView(frame:CGRect(x:self.view.frame.size.width,y:0,width:self.view.frame.size.width,height:self.view.frame.size.height))
someView.backgroundColor = .red
UIView.animate(withDuration:0.3,animations:{
    self.someView.frame.origin.x = 0
})

//You can wrap this with something like:
//dispatchQueue.global(qos: .background).async(execute: {
//But this^ doesn't work on the majority of the code within the loop
for i in 0...1000{
    print("hopefully this loop takes a few seconds to finish executing")
    print("mainthread tasks being executed")
    print("populating UITable in my particular case,and rendering Images/Video/text")
}

使它变得更好的最接近方法是在我的UIAnimation中添加一个“补全”(这将允许UIView完全/立即退出),但是在第一个之前还有第二个等待时间消息出现...

此外,我正在for循环中填充UITableView。不确定这与我遇到的主要问题是否有其他关联...

我对dispatchQueue和异步/同步之间的区别非常熟悉。如果您有任何潜在的解决方案或想法,请告诉我。

解决方法

调用UIView.animate时,动画不会立即发生。取而代之的是,所有动画都将在适当的时间收集并运行。这就是为什么动画仅在您的for循环完成后 开始播放的原因。

因此解决此问题的方法是让动画在for循环运行之前 运行。现在,接受您所说的for必须在主线程上运行的情况,您有了许多选择。您可以将for循环放在DispatchQueue.main.async{}内,或以某种方式降低其速度,以使动画首先开始。您使用完井的想法是一个好主意,但您提到了由此而来的一些实际问题。因此,要么解决这些实际问题,要么尝试在for内运行DispatchQueue.main.async{},或者甚至基于实际考虑,在主线程上启动for循环,但在其他地方,例如像didLayoutSubviews(已修复)或现在与动画一起使用,但经过几毫秒的延迟才允许动画开始播放。

,

这是一个有趣的问题。这让我思考!

是的,您提到您了解异步/同步之间的区别,但没有提及您是否尝试在主线程中进行动画处理。

您尝试将 UIView.animate(...)中的DispatchQueue.main.async{}