`SCNetworkReachabilityScheduleWithRunLoop` 还是`SCNetworkReachabilitySetDispatchQueue`?和比赛条件
Posted
技术标签:
【中文标题】`SCNetworkReachabilityScheduleWithRunLoop` 还是`SCNetworkReachabilitySetDispatchQueue`?和比赛条件【英文标题】:`SCNetworkReachabilityScheduleWithRunLoop` or `SCNetworkReachabilitySetDispatchQueue`? And race condition 【发布时间】:2016-02-16 13:05:41 【问题描述】:我们的 Objective-C 应用需要检测网络可达性的变化。 CocoaPods 目前提供的选择太多了,所以我们不知道如何选择。
所有可达性 pod 都使用 SCNetworkReachabilityScheduleWithRunLoop
或 SCNetworkReachabilitySetDispatchQueue
:两者之间是否存在行为差异? (除了第一个对 ios 2 和 iOS 3 的微不足道的支持)
Last comment from Oleg on Mike Ash blog reads:
困扰我的是当我在辅助线程中调用 SCNetworkReachabilityGetFlags 时可能发生的潜在竞争条件,而 SCNetworkReachabilityScheduleWithRunLoop 已在主运行循环中设置。
将有两个不同的线程同时检查网络可达性并将其结果返回给主线程。如果网络状态在两者之间发生变化,则事件可能会以错误的顺序出现在运行循环队列中。
有没有办法保证正确的事件顺序?理想情况下,让 SCNetworkReachabilityScheduleWithRunLoop 在请求时触发事件(不仅仅是在实际网络状态更改时)
我们想弄清楚哪些 pod 最可靠,SCNetworkReachabilitySetDispatchQueue
是否正在解决 Oleg 的竞争条件问题?或者有没有一种模式可以解决我们在选择 pod 时应该寻找的竞争条件问题?
举几个例子,以下是我们注意到的……
他们使用SCNetworkReachabilityScheduleWithRunLoop
:
他们使用SCNetworkReachabilitySetDispatchQueue
:
【问题讨论】:
【参考方案1】:SCNetworkReachabilityScheduleWithRunLoop
和 SCNetworkReachabilitySetDispatchQueue
应该是等价的。至于竞争条件问题,解决它的明显方法是只从您的可达性回调中调用SCNetworkReachabilityGetFlags
。另一个,如果你真的想从并发线程调用它,可能会为它使用单独的SCNetworkReachabilityRef
(到同一主机)。
【讨论】:
以上是关于`SCNetworkReachabilityScheduleWithRunLoop` 还是`SCNetworkReachabilitySetDispatchQueue`?和比赛条件的主要内容,如果未能解决你的问题,请参考以下文章