我有一个长时间运行的循环,其中涉及大量的UI函数。因此,此循环必须在主线程上运行。但是,我也想显示此任务的进度,因此它也必须在主线程上运行,因为显示当前进度将涉及更新UI。我真的很努力地寻找一种方法,当主循环也在主线程上运行时,允许UI根据主线程上的当前进度进行更新。发生的情况是,UI在循环过程中被冻结,然后进行更新以表明该过程完成了。
这不是用于生产应用程序,而是用于永远不会发布的个人项目。因此,它是不关心的,该UI是从UX的角度冻结。如果解决方案涉及将处理置于后台,那么这种重构就可以了,但是当此循环中的许多繁重工作也涉及UI内容时,我不确定如何进行处理。
答案 0 :(得分:2)
您有时在发布问题后有时会提出解决方案吗?!关键似乎不是使用for循环进行处理,而是将处理函数放在单独的方法中并重复调用它,将要处理的对象数组传递给它。为此,您可以使用[self performSelector:withObject:afterDelay:]
调用该函数。即使为延迟提供了零值,它也会导致在下一个运行循环中调用该方法。这意味着您可以更新UI,处理下一个项目,然后重复此过程,直到项目数组为空。这是我完整的解决方案。如果有人知道更好的方法,我还是很想听听,但是目前至少可以正常工作!
编辑-我将此解决方案打包为一个自己的类,以使其易于管理,并将其放在我的Github上。也许会帮助别人:)
编辑2-通过使处理类运行循环而不是遍历数组来使其更加灵活。根据自述文件中的示例,您当然可以使用它自己遍历数组。但是,如果您不使用数组,则可以运行循环runCount
次,然后在processingBlock
中进行所需的操作。