#objective-c #ios #multithreading #cocoa-touch #nsrunloop
#objective-c #iOS #многопоточность #cocoa-touch #nsrunloop
Вопрос:
У меня есть приложение для iPad, которое получает данные с помощью сокетов UDP. И у него есть UIWebView для просмотра веб-страниц. Но при выполнении прокрутки в UIWebView все зависает, и данные не принимаются. Я искал, и это как-то связано с циклами выполнения и потоками. Но если UIWebView не может запускаться в другом потоке, отличном от основного, как я могу получать данные во время прокрутки? Очень важно продолжать получать данные.
В проекте используется класс AsyncUdpSocket из Cocoa AsyncSocket, который работает довольно хорошо. А также одноэлементный класс от Мэтта Галлахера. Все выполняется в основном потоке, приеме UDP и пользовательском интерфейсе.
Заранее спасибо!
Комментарии:
1. Вам нужно подробнее рассказать о том, как вы работаете с UDP. И я рекомендую использовать AsyncSocket (он выполняет TCP и UDP).
2. Похоже, что вы ожидаете UDP-пакетов в основном потоке, блокируя пользовательский интерфейс.
3. Я использую класс AsyncUdpSocket из ссылки Cocoa AsyncSocket, которая работает довольно хорошо. А также одноэлементный класс по ссылке Мэтта Галлахера. У меня все запущено в основном потоке, приеме UDP и пользовательском интерфейсе.
Ответ №1:
Когда вы выполняете прокрутку, цикл выполнения переходит в другой режим ( UITrackingRunLoopMode
) и перестает отвечать на сетевую активность в основном потоке. Это сделано из соображений производительности.
Вы должны иметь возможность планировать эти обновления в правильном режиме runloop ( UITrackingRunLoopMode
я полагаю). Хотя я бы не рекомендовал это.
Вместо этого попробуйте настроить сетевой код UDP в другом потоке (или очереди, yay GCD!) и запланировать обратные вызовы в главном потоке для обновления пользовательского интерфейса. Это гарантирует, что сетевой поток имеет надлежащий режим runloop при возврате данных в сокет.