Обновление пользовательского интерфейса с прогрессом во время интенсивного пользовательского цикла - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть длительный цикл, который включает в себя значительное количество функций пользовательского интерфейса.Следовательно, этот цикл должен выполняться в главном потоке.Однако я также хочу отобразить ход выполнения этой задачи, поэтому он также должен выполняться в главном потоке, поскольку отображение текущего прогресса потребует обновления пользовательского интерфейса.Я действительно изо всех сил пытаюсь найти способ обновления пользовательского интерфейса с текущим прогрессом в основном потоке, когда основной цикл также выполняется в основном потоке.Что происходит, так это то, что пользовательский интерфейс замораживается во время цикла, а затем обновляется, показывая, что процесс завершен, когда он завершен.

Это не для производственного приложения, а для личного проекта, который никогда не будет выпущен.Так что не стоит беспокоиться, что пользовательский интерфейс заморожен с точки зрения UX.Если решение заключается в том, чтобы перевести обработку в фоновый режим, то этот рефакторинг в порядке, но я не уверен, как это сделать, когда большая часть тяжелой работы в течение этого цикла также связана с пользовательским интерфейсом.

1 Ответ

0 голосов
/ 03 февраля 2019

Разве не смешно, что вы иногда находите решение сразу после публикации вопроса ?!Ключ, скорее всего, заключался в том, чтобы не использовать цикл for для обработки, а поместить функцию обработки в отдельный метод и многократно вызывать ее, передавая массив объектов для обработки.Делая это, вы можете вызвать функцию, используя [self performSelector:withObject:afterDelay:].Даже если вы укажете значение нуля для задержки, это вызовет вызов метода в следующем цикле выполнения.Это означает, что вы можете обновить пользовательский интерфейс, обработать следующий элемент и повторять этот процесс до тех пор, пока массив элементов не станет пустым.Вот мое законченное решение.Если кто-нибудь знает лучший способ, я все еще хотел бы услышать это, но сейчас это по крайней мере работает!

Правка - я упаковал это решение в отдельный класс, чтобы им было легче управлять,и положи его на мой Github.Может быть, это поможет кому-то еще:)

Edit 2 - сделал класс обработки более гибким, заставив его запускать циклы вместо итераций по массивам.Конечно, вы можете использовать его для самостоятельной итерации массива в соответствии с примером в файле readme.Но если вы не работаете с массивом, вы можете просто запустить цикл runCount раз и сделать все, что вам нужно сделать в processingBlock.

https://github.com/mashers/BackgroundLoopProcessor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...