Как лучше всего обеспечить блокировку основного потока во время обработки фонового потока? - PullRequest
0 голосов
/ 17 июня 2020

Рассмотрим следующий случай:

Main Thread -----UIView info \ --------------------------------------- / Button Updated ------
                              \ (Some Event)                          / (Some Event)
                               \                                     /
BG Thread ---------------------Validate UIView info-----Update Button------------------------
  1. В основном потоке присутствует UIView
  2. UIView выполняет диспетчерский вызов фонового потока
  3. В потоке BG проверяется информация UIView.
  4. Поток BG выполняет диспетчерский вызов UIButton в основном потоке, чтобы обновить его.

Мой вопрос - уведомление как существует разрыв между информацией UIView и UIButton, что означает, что приложение может технически обновляться в течение этого времени. Как я могу восполнить этот пробел? По сути, из потока BG заблокировать основной поток, пока вызов не вернется?

Ответы [ 4 ]

4 голосов
/ 17 июня 2020

Вы не можете и никогда не должны блокировать основной поток. Если вы это сделаете, интерфейс зависнет, и, если блокировка продлится слишком долго, процесс WatchDog убьет ваше приложение на глазах у пользователя.

Вы можете дать пользователю ощущение, что что-то происходит, и отговаривать пользователя от каких-либо действий, например, отключив взаимодействие с пользователем и установив счетчик. Но в целом, да, многопоточность - это сложно; вы должны быть готовы к тому, что вы вернетесь к основному потоку, когда приложение изменит состояние.

3 голосов
/ 17 июня 2020

Вместо того, чтобы блокировать основной поток, отключите элементы управления пользовательским вводом в вашем представлении до завершения проверки, а затем снова включите их.

Также имеет смысл добавить индикатор активности с hidesWhenStopped, установленным на true ; он покажет пользователю, что выполняется фоновая работа, если вы запустите ее, когда начнется фоновая работа, и остановите ее, когда проверка будет завершена.

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

Отображение индикатора активности и, возможно, предоставление кнопки отмены требуют, чтобы основной поток продолжал работать, поэтому определенно не t заблокировать это!

1 голос
/ 17 июня 2020

Ваша кнопка не должна обновляться в фоновом режиме. Вы всегда должны изменять UIKit компоненты в основном потоке.

Вы также никогда не должны блокировать основной поток, вы ищете, чтобы показать пользователю указание на то, что фоновый процесс активен. 'UIActivityIndicatorView' может быть хорошей вещью для демонстрации пользователю, вы также можете отключить взаимодействие с пользователем в представлении, чтобы пользователь не касался чего-либо, если для него критически важно дождаться завершения операции, но не рекомендуется.

0 голосов
/ 17 июня 2020

Да, вы никогда не должны блокировать основной поток и обновлять пользовательский интерфейс только в основном потоке.

Тем не менее, показывать индикатор активности / счетчика, когда он занят в фоновом режиме.

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

На практике это часто становится больше вопросом UX, чем блокировкой.

...