`SCNetworkReachabilityScheduleWithRunLoop` 还是`SCNetworkReachabilitySetDispatchQueue`?和比赛条件

Posted

技术标签:

【中文标题】`SCNetworkReachabilityScheduleWithRunLoop` 还是`SCNetworkReachabilitySetDispatchQueue`?和比赛条件【英文标题】:`SCNetworkReachabilityScheduleWithRunLoop` or `SCNetworkReachabilitySetDispatchQueue`? And race condition 【发布时间】:2016-02-16 13:05:41 【问题描述】:

我们的 Objective-C 应用需要检测网络可达性的变化。 CocoaPods 目前提供的选择太多了,所以我们不知道如何选择。

所有可达性 pod 都使用 SCNetworkReachabilityScheduleWithRunLoopSCNetworkReachabilitySetDispatchQueue两者之间是否存在行为差异? (除了第一个对 ios 2 和 iOS 3 的微不足道的支持)

Last comment from Oleg on Mike Ash blog reads:

困扰我的是当我在辅助线程中调用 SCNetworkReachabilityGetFlags 时可能发生的潜在竞争条件,而 SCNetworkReachabilityScheduleWithRunLoop 已在主运行循环中设置。

将有两个不同的线程同时检查网络可达性并将其结果返回给主线程。如果网络状态在两者之间发生变化,则事件可能会以错误的顺序出现在运行循环队列中。

有没有办法保证正确的事件顺序?理想情况下,让 SCNetworkReachabilityScheduleWithRunLoop 在请求时触发事件(不仅仅是在实际网络状态更改时)

我们想弄清楚哪些 pod 最可靠,SCNetworkReachabilitySetDispatchQueue 是否正在解决 Oleg 的竞争条件问题?或者有没有一种模式可以解决我们在选择 pod 时应该寻找的竞争条件问题?

举几个例子,以下是我们注意到的……

他们使用SCNetworkReachabilityScheduleWithRunLoop:

https://github.com/AFNetworking/AFNetworking 2016 年 1 月 https://github.com/skywite/SWReachability 2015 年 6 月 https://github.com/kstenerud/KSReachability 2015 年 5 月 https://github.com/nicklockwood/FXReachability 2015 年 3 月 https://github.com/jaredsinclair/JTSReachability 2014 年 8 月 https://github.com/Abizern/NPReachability 2014 年 5 月 https://github.com/dev5tec/FBNetworkReachability 2014 年 3 月 https://developer.apple.com/library/content/samplecode/Reachability/ 2015 年 12 月

他们使用SCNetworkReachabilitySetDispatchQueue:

https://github.com/belkevich/reachability-ios 2016 年 1 月 https://github.com/dustturtle/RealReachability 2016 年 1 月 https://github.com/sger/SGReachability 2015 年 10 月 https://github.com/GlennChiu/GCNetworkReachability 2014 年 6 月 tonymillion's reachability,但他声称被 Apple 拒绝了

【问题讨论】:

【参考方案1】:

SCNetworkReachabilityScheduleWithRunLoopSCNetworkReachabilitySetDispatchQueue 应该是等价的。至于竞争条件问题,解决它的明显方法是只从您的可达性回调中调用SCNetworkReachabilityGetFlags。另一个,如果你真的想从并发线程调用它,可能会为它使用单独的SCNetworkReachabilityRef(到同一主机)。

【讨论】:

以上是关于`SCNetworkReachabilityScheduleWithRunLoop` 还是`SCNetworkReachabilitySetDispatchQueue`?和比赛条件的主要内容,如果未能解决你的问题,请参考以下文章