`SCNetworkReachabilityScheduleWithRunLoop`或`SCNetworkReachabilitySetDispatchQueue`?和种族条件

时间:2016-02-16 13:05:41

标签: ios objective-c multithreading macos reachability

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

所有可访问性窗格都使用SCNetworkReachabilityScheduleWithRunLoopSCNetworkReachabilitySetDispatchQueue是否存在期望来自其中一个的行为差异? (除了iOS 2和iOS 3的第一个支持)

Last comment from Oleg on Mike Ash blog reads

  

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

     

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

     

有没有办法保证正确的活动顺序?理想情况下,使SCNetworkReachabilityScheduleWithRunLoop根据请求触发事件(不仅仅是在实际网络状态发生变化时)

由于我们想确定哪些豆荚最可靠,SCNetworkReachabilitySetDispatchQueue解决奥列格的竞争条件问题?或者是否有一种模式可以解决竞争条件问题,我们在选择一个吊舱时应该寻找它?

列举几个例子,这是我们注意到的......

他们使用SCNetworkReachabilityScheduleWithRunLoop

他们使用SCNetworkReachabilitySetDispatchQueue

1 个答案:

答案 0 :(得分:1)

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