"SCNetworkReachabilityScheduleWithRunLoop" или "SCNetworkReachabilitySetDispatchQueue"? И состояние гонки

Наше приложение Objective-C требует обнаружения изменений достижимости сети. CocoaPods в настоящее время предлагает слишком много альтернатив, поэтому мы не знаем, как выбрать один.

Все контейнеры достижимости используют либо SCNetworkReachabilityScheduleWithRunLoop или же SCNetworkReachabilitySetDispatchQueue: есть ли различия в поведении, ожидаемые от одного или другого? (кроме тривиальной поддержки iOS 2 и iOS 3 для первого)

Последний комментарий Олега к блогу Майка Эша гласит:

Что меня беспокоит, так это состояние потенциальной гонки, которое может возникнуть, когда я вызываю SCNetworkReachabilityGetFlags в вспомогательном потоке, в то время как SCNetworkReachabilityScheduleWithRunLoop уже установлен в главном цикле выполнения.

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

Есть ли способ гарантировать правильный порядок событий? В идеале, чтобы SCNetworkReachabilityScheduleWithRunLoop вызывал события по запросу (не только при фактическом изменении состояния сети)

Как мы хотели бы выяснить, какие стручки являются наиболее надежными, SCNetworkReachabilitySetDispatchQueue решение проблемы Олега? Или есть шаблон для решения проблем состояния гонки, на который мы должны обратить внимание при выборе стручка?

Чтобы перечислить несколько примеров, вот что мы заметили...

Они используют SCNetworkReachabilityScheduleWithRunLoop:

Они используют SCNetworkReachabilitySetDispatchQueue:

1 ответ

И то и другое SCNetworkReachabilityScheduleWithRunLoop а также SCNetworkReachabilitySetDispatchQueue должен быть эквивалентным. Что касается вопроса о состоянии гонки, очевидный способ решить его - это вызвать SCNetworkReachabilityGetFlags от вашего обратного звонка. Другой, если вы действительно хотите вызвать его из параллельного потока, вероятно, будет использовать отдельный SCNetworkReachabilityRef за это (тому же хосту).

Другие вопросы по тегам