"SCNetworkReachabilityScheduleWithRunLoop" или "SCNetworkReachabilitySetDispatchQueue"? И состояние гонки
Наше приложение Objective-C требует обнаружения изменений достижимости сети. CocoaPods в настоящее время предлагает слишком много альтернатив, поэтому мы не знаем, как выбрать один.
Все контейнеры достижимости используют либо SCNetworkReachabilityScheduleWithRunLoop
или же SCNetworkReachabilitySetDispatchQueue
: есть ли различия в поведении, ожидаемые от одного или другого? (кроме тривиальной поддержки iOS 2 и iOS 3 для первого)
Последний комментарий Олега к блогу Майка Эша гласит:
Что меня беспокоит, так это состояние потенциальной гонки, которое может возникнуть, когда я вызываю SCNetworkReachabilityGetFlags в вспомогательном потоке, в то время как SCNetworkReachabilityScheduleWithRunLoop уже установлен в главном цикле выполнения.
Будут два разных потока, одновременно проверяющих доступность сети и возвращающих свой результат в основной поток. Если состояние сети изменяется где-то посередине, события могут появляться в очереди цикла выполнения в неправильном порядке.
Есть ли способ гарантировать правильный порядок событий? В идеале, чтобы SCNetworkReachabilityScheduleWithRunLoop вызывал события по запросу (не только при фактическом изменении состояния сети)
Как мы хотели бы выяснить, какие стручки являются наиболее надежными, SCNetworkReachabilitySetDispatchQueue
решение проблемы Олега? Или есть шаблон для решения проблем состояния гонки, на который мы должны обратить внимание при выборе стручка?
Чтобы перечислить несколько примеров, вот что мы заметили...
Они используют SCNetworkReachabilityScheduleWithRunLoop
:
- https://github.com/AFNetworking/AFNetworking янв 2016
- https://github.com/skywite/SWReachability июнь 2015
- https://github.com/kstenerud/KSReachability май 2015
- https://github.com/nicklockwood/FXReachability март 2015
- https://github.com/jaredsinclair/JTSReachability август 2014 г.
- https://github.com/Abizern/NPReachability май 2014
- https://github.com/dev5tec/FBNetworkReachability март 2014 г.
- https://developer.apple.com/library/content/samplecode/Reachability/ дек 2015
Они используют SCNetworkReachabilitySetDispatchQueue
:
- https://github.com/belkevich/reachability-ios январь 2016 г.
- https://github.com/dustturtle/RealReachability январь 2016
- https://github.com/sger/SGReachability октябрь 2015
- https://github.com/GlennChiu/GCNetworkReachability июнь 2014 г.
- достижимость Tonymillion, но он утверждает, что это отклонено Apple
1 ответ
И то и другое SCNetworkReachabilityScheduleWithRunLoop
а также SCNetworkReachabilitySetDispatchQueue
должен быть эквивалентным. Что касается вопроса о состоянии гонки, очевидный способ решить его - это вызвать SCNetworkReachabilityGetFlags
от вашего обратного звонка. Другой, если вы действительно хотите вызвать его из параллельного потока, вероятно, будет использовать отдельный SCNetworkReachabilityRef
за это (тому же хосту).