我有一个提取消息日志的UIAnimation,但我还需要使用for循环填充消息日志。我让动画发生在for循环开始之前,然而,直到for循环结束执行之后,动画才真正开始(即使该循环位于UIAnimation之后)。
我试着把for循环的内容放在一个自动释放池中(不起作用)
我尝试过在后台线程上运行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和异步/同步之间的区别。如果您有任何潜在的解决方案或想法,请让我知道。
发布于 2020-10-11 14:16:21
当您调用UIView.animate时,动画不会立即发生。取而代之的是,所有的动画都被收集起来,并在适当的时间运行。这就是为什么动画只有在for循环完成后才会开始。
因此,修复它的方法是让动画在for循环运行之前运行。现在,接受您所说的for必须在主线程上运行,您有很多选择。您可以将for循环放在DispatchQueue.main.async{}中,或者以某种方式限制它,以便动画最先开始。您使用完成的想法很好,但您提到了一些使用它时遇到的实际问题。所以要么解决这些实际问题,试着在DispatchQueue.main.async{}中运行for,或者甚至,基于实际考虑,在主线程上启动for循环,但在其他地方,比如didLayoutSubviews (修复),或者像现在一样与动画一起运行,但在几个毫秒延迟之后,允许动画开始运行。
发布于 2020-10-11 13:57:59
这是一个有趣的问题。这让我开始思考!
是的,你提到你理解异步/同步之间的区别,但没有提到你是否尝试在主线程中进行动画。
你有没有试着把UIView.animate(...)放入DispatchQueue.main.async{}
https://stackoverflow.com/questions/64300872
复制相似问题