Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在UI密集型循环期间使用进度更新UI_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 在UI密集型循环期间使用进度更新UI

Objective c 在UI密集型循环期间使用进度更新UI,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我有一个长期运行的循环,它涉及大量的UI函数。因此,此循环必须在主线程上运行。但是,我还希望显示此任务的进度,因此它也必须在主线程上运行,因为显示当前进度将涉及更新UI。当主循环也在主线程上运行时,我真的很难找到一种允许UI在主线程上更新当前进度的方法。发生的情况是,UI在循环过程中被冻结,然后更新,以显示流程完成后已完成 这不是用于生产应用程序,而是用于永远不会发布的个人项目。因此,从用户体验的角度来看,用户界面被冻结并不重要。如果解决方案涉及将处理放在后台,那么这种重构是可以的,但我不确定在

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


这不是用于生产应用程序,而是用于永远不会发布的个人项目。因此,从用户体验的角度来看,用户界面被冻结并不重要。如果解决方案涉及将处理放在后台,那么这种重构是可以的,但我不确定在这个循环中的许多繁重工作也涉及到UI内容时该如何做。

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

编辑-我将这个解决方案打包成一个自己的类,使其更易于管理,并将其放在我的Github上。也许它会帮助其他人:)

edit2-通过使处理类运行循环而不是遍历数组,使其更加灵活。当然,您可以自己使用它来迭代数组,如自述文件中的示例所示。但是如果您不使用数组,您可以只运行循环
runCount
次,并在
processingBlock
中执行您需要执行的任何操作


这不是很有趣吗。。。发布问题后?!没有乐趣,努力清晰地表达问题是解决问题的第一步,有时解决问题只有一步。是的,你是绝对正确的。我在这里提出的一些问题的答案是公认的,正是出于这个原因:)