Приложение перестает получать данные из сокета при прокрутке пользовательского интерфейса

#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 при возврате данных в сокет.