Не можем ли мы создать другой поток и запустить runloop, который будет прослушивать события касания или что-либо, связанное с пользовательским интерфейсом? Проводятся ли какие-либо исследования по работе с задачами пользовательского интерфейса в многопоточной среде?Почему мы должны выполнять все связанные с UI задачи в основном потоке?
ответ
UIKit не является внутренним поточно-безопасным.
Мне кажется, что я должен объяснить дальше, но на самом деле это весь ответ. Нет исследований в этой области за пределами Apple, потому что только Apple поддерживает UIKit. Маловероятно, что они будут массово переписывать UIKit, чтобы сделать его потокобезопасным, не говоря уже о существенном снижении производительности, которое они наложили, сделав это. Вы должны выполнить всю работу вашего интерфейса и основного контекстного рисования в основном потоке, если в документах явно не указано иное.
Возможно, стоит пойти немного дальше: существует очень ограниченное значение значение для многопоточного пользовательского интерфейса. Каждый пиксель может отображать только одну вещь за раз. Емкостные сенсорные датчики могут отправлять только один сигнал за раз. Существует только один интерфейс. Обещание concurrency and/or parallelism заключается в том, что я могу либо лучше рассуждать о проблеме одновременно, либо что я могу лучше использовать параллельное оборудование. Я не могу фактически нарисовать две вещи одновременно. Существует только один экран. В конечном итоге я рисую одно. Куча кривых, в конце концов, по-прежнему остается одной «картиной». Он составлен и составлен как одна вещь. Это в отличие от вычислительной работы. Я могу на самом деле вычислить две кривые безье в то же время, полностью параллельно и больше использовать аппаратное обеспечение. И это то, что я могу сделать сегодня на других потоках.
Это не означает, что внутри UIKit нет параллелизма. Существует как программное обеспечение, так и аппаратное обеспечение. Но нет большой ценности для того, чтобы взять на себя высокую сложность и производительность за счет предоставления ретентатного API для обработки пользовательского интерфейса. Кроме того, пользовательские интерфейсы - это самые сдержанные вещи, которые вы можете иметь, а изменчивое состояние - заклятый враг многопоточного кода. Даже если бы это было ценно, код пользовательского интерфейса особенно сложно сделать реентерабельным и потокобезопасным. Это более или менее верно для многих платформ, как вы заметили.
Но я чувствую, что в других технологиях, будь то новый или старый, нет поддержки многопоточности для задач пользовательского интерфейса. Трудно ли достичь или вообще невозможно? – Anshu
- 1. Почему задачи выполняются в основном потоке?
- 2. WCF: Как выполнять фоновые задачи на основном потоке IIS?
- 3. Почему должны выполняться операции UIKit в основном потоке?
- 4. Почему AsyncTask запускается в основном потоке приложения?
- 5. Метод, который выполняет продолжение задачи в основном потоке
- 6. Почему моя AsyncTask работает в основном потоке?
- 7. Почему ImageView.StartAnimating не анимируется в основном потоке
- 8. Почему мой NSOperationQueue работает в основном потоке?
- 9. Как выполнять длительные задачи?
- 10. Почему мы должны выпускать?
- 11. Почему моя анимация игнорируется при вызове закрытия в основном потоке?
- 12. Найти все задачи, связанные с buildType?
- 13. Вызов делегата в основном потоке от асинхронной задачи
- 14. Как узнать, работаем ли мы в основном потоке?
- 15. почему мы должны WCF
- 16. WatchOS: Должны ли вызываться обновления UI от расширения в основном потоке?
- 17. Почему мы должны очищать стек?
- 18. Почему операция UI должен выполняться на главном потоке в Android
- 19. UI не обновляется в основном потоке при выполнении segue
- 20. Почему эти задачи запускаются в одном потоке?
- 21. Должны ли мы выполнять операцию db с помощью @PathVariable весной?
- 22. Почему мы должны использовать HandleErrorAttribute?
- 23. Должны ли исключения, возникающие в потоке пользовательского интерфейса, но возникающие в другом потоке, поднимают UI ThreadException?
- 24. Почему градиент чистой задачи запускает все другие задачи, не связанные с дефолтом?
- 25. Почему мы должны использовать EJB?
- 26. Выполнять делегат в потоке ui (используя насос сообщений)
- 27. Почему мы должны установить Laravel с композитором?
- 28. Почему мы должны использовать @using с Html.BeginForm
- 29. Почему мы должны использовать категорию в IOS?
- 30. Почему мы должны помещать glGetError в цикл?
Это очень старый, но может быть полезен: https://community.oracle.com/blogs/kgh/2004/10/19/multithreaded-toolkits-failed-dream – Anshu