2016-02-16 1 views
1

Notre application Objective-C nécessite la détection des changements d'accessibilité réseau. CocoaPods offre actuellement beaucoup trop d'alternatives, donc nous ne savons pas comment en choisir un.`SCNetworkReachabilityScheduleWithRunLoop` ou` SCNetworkReachabilitySetDispatchQueue`? Et la condition de course

Toutes les gousses de joignabilité utilise soit SCNetworkReachabilityScheduleWithRunLoop ou SCNetworkReachabilitySetDispatchQueue: sont-il des différences de comportement à attendre de l'un ou l'autre? (À part le soutien trivial d'iOS 2 et iOS 3 pour le premier)

Last comment from Oleg on Mike Ash blog reads:

Ce qui me dérange est la condition de course potentielle qui peut se produire quand je l'appelle SCNetworkReachabilityGetFlags dans un fil d'aide, tandis que le SCNetworkReachabilityScheduleWithRunLoop a déjà été défini dans la boucle d'exécution principale.

Il y aura deux threads différents qui vérifient à la fois l'accessibilité du réseau et le retour du résultat au thread principal. Si l'état du réseau change entre les deux, les événements peuvent apparaître dans la file d'attente de la boucle d'exécution dans un ordre incorrect.

Existe-t-il un moyen de garantir l'ordre d'événement correct? Idéalement, pour faire le SCNetworkReachabilityScheduleWithRunLoop pour déclencher des événements sur demande (non seulement sur le changement d'état réel du réseau)

Comme nous aimerions savoir quels gousses sont les plus fiables, est SCNetworkReachabilitySetDispatchQueue adresser une solution à la course de Oleg problème de condition? Ou y at-il un modèle pour résoudre les problèmes de condition de course que nous devrions rechercher lors du choix d'un pod?

Pour énumérer quelques exemples, voici ce que nous avons remarqué ...

Ils utilisent SCNetworkReachabilityScheduleWithRunLoop:

Ils utilisent SCNetworkReachabilitySetDispatchQueue:

Répondre

1

Les deux SCNetworkReachabilityScheduleWithRunLoop et SCNetworkReachabilitySetDispatchQueue devrait être équivalent. En ce qui concerne le problème de la condition de concurrence, le moyen le plus évident de le résoudre est de n'appeler que SCNetworkReachabilityGetFlags à partir de votre callback d'atteignabilité. Un autre, si vous voulez vraiment l'appeler à partir d'un thread concurrent, utiliserait probablement un SCNetworkReachabilityRef séparé pour le même hôte.