我们的Objective-C应用需要检测网络可达性变化。 CocoaPods目前提供的选择太多,所以我们不知道如何选择一个。
所有可访问性窗格都使用SCNetworkReachabilityScheduleWithRunLoop
或SCNetworkReachabilitySetDispatchQueue
:是否存在期望来自其中一个的行为差异? (除了iOS 2和iOS 3的第一个支持)
Last comment from Oleg on Mike Ash blog reads:
让我困扰的是当我在辅助线程中调用SCNetworkReachabilityGetFlags时可能发生的竞争条件,而SCNetworkReachabilityScheduleWithRunLoop已在主运行循环中设置。
将会有两个不同的线程同时检查网络可达性并将结果返回给主线程。如果网络状态在两者之间的某处发生变化,则事件可能会以错误的顺序出现在运行循环队列中。
有没有办法保证正确的活动顺序?理想情况下,使SCNetworkReachabilityScheduleWithRunLoop根据请求触发事件(不仅仅是在实际网络状态发生变化时)
由于我们想确定哪些豆荚最可靠,是SCNetworkReachabilitySetDispatchQueue
解决奥列格的竞争条件问题?或者是否有一种模式可以解决竞争条件问题,我们在选择一个吊舱时应该寻找它?
列举几个例子,这是我们注意到的......
他们使用SCNetworkReachabilityScheduleWithRunLoop
:
他们使用SCNetworkReachabilitySetDispatchQueue
:
答案 0 :(得分:1)
SCNetworkReachabilityScheduleWithRunLoop
和SCNetworkReachabilitySetDispatchQueue
都应该是等效的。至于竞争条件问题,解决它的明显方法是只从你的可达性回调中调用SCNetworkReachabilityGetFlags
。另一个,如果你真的想从并发线程中调用它,可能会为它使用一个单独的SCNetworkReachabilityRef
(到同一个主机)。