在 UI 密集循环期间用进度更新 UI

Update UI with progress during UI-intensive loop

我有一个很长的 运行ning 循环,其中涉及相当多的 UI 函数。因此这个循环必须在主线程上 运行 。但是,我还想显示此任务的进度,因此这也必须在主线程上 运行,因为显示当前进度会涉及更新 UI。当主循环也在主线程上 运行ning 时,我真的很难找到一种方法来允许 UI 在主线程上更新当前进度。发生的情况是 UI 在循环期间被冻结,然后更新以显示该过程在完成时已完成。

这不是用于生产应用程序,而是用于永远不会发布的个人项目。因此,从用户体验的角度来看,UI 被冻结并不重要。如果解决方案涉及将处理置于后台,那么这种重构很好,但是当这个循环中的大量繁重工作也涉及 UI 东西时,我不确定如何去做。

您有时会在发布问题后想出解决方案,这不是很有趣吗?!关键似乎不是使用 for 循环进行处理,而是将处理函数放在一个单独的方法中并反复调用它,将要处理的对象数组传递给它。这样做,您可以使用 [self performSelector:withObject:afterDelay:] 调用该函数。即使您为延迟提供零值,它也会导致在下一个 运行 循环中调用该方法。这意味着您可以更新 UI,处理下一个项目,并重复此过程,直到项目数组为空。这是我完成的解决方案。如果有人知道更好的方法,我仍然很乐意听到它,但现在这至少是有效的!

编辑 - 我将此解决方案打包成一个单独的 class 以便于管理,并将其放在我的 Github 上。也许它会帮助其他人 :)

编辑 2 - 通过使 运行 循环而不是遍历数组,使处理 class 更加灵活。您当然可以按照自述文件中的示例使用它自己遍历数组。但是如果你不使用数组,你可以只 运行 循环 runCount 次并在 processingBlock.

中做你需要做的任何事情

https://github.com/mashers/BackgroundLoopProcessor