2016-05-03 1 views
2

J'utilise lib nommé RealReachability qui obtient l'état d'accessibilité en temps réel!Comment arrêter l'exécution de fonction si la connexion Internet est perdue

Et j'ai une fonction qui obtient des données de mon serveur.

Maintenant son ressembler à ceci:

RealReachability.sharedInstance().reachabilityWithBlock { (status: ReachabilityStatus) in 
     switch status { 
     case .RealStatusNotReachable: 
      break 
     default: 
     operationQueue.addOperationWithBlock { 
      GettingDataFromServer() } 
     } 
    } 

également RealReachability peut envoyer une notification lorsque le statut a changé joignabilité. Son look comme ceci:

var operationQueue = NSOperationQueue() 
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyController.networkChanged), name: kRealReachabilityChangedNotification, object: nil) 

    func networkChanged(notification: NSNotification) { 
    print("NetworkChanged") 

    let status = RealReachability.sharedInstance().currentReachabilityStatus() 

    switch status { 
    case .RealStatusNotReachable: 
     print("try to stop Operation") 
     operationQueue.cancelAllOperations() 
     ShowInternetConnectionErrorView() 

    default: 
     print("Internet OK!") 
    } 



} 

Que dois-je arrêter l'exécution de la fonction GettingDataFromServer() lorsque l'état de joignabilité changé .RealStatusNotReachable

+0

Vous voulez dire quand func est en cours d'exécution? –

+0

Arun Gupta, oui je veux dire quand func est en cours d'exécution !!! – Dmitry

+0

Vous devrez peut-être utiliser NSOperationqueue ou dispatchqueue pour exécuter la fonction et annuler l'opération lors de la réception de la notification. –

Répondre

0

Dans RealReachabilitylibrary, GLobalRealReachability est l'instance partagée. Ainsi, vous pouvez interroger cette classe pour connaître l'état actuel:

let status = GLobalRealReachability.currentReachabilityStatus 
if (status == RealStatusNotReachable) 
{ 
    //do whatever you want when internet is not reachable 
    // To stop your observer you can do: 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
    // ...or by specify the exact name: 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: kRealReachabilityChangedNotification, object: nil) 
} 

Dans votre code pour arrêter directement votre NSOperation que vous pouvez faire:

var global:

var operation1 : NSBlockOperation! 

self.operation1 : NSBlockOperation = NSBlockOperation ({ 
      GettingDataFromServer() 
}) 

et modifier votre code en :

RealReachability.sharedInstance().reachabilityWithBlock { (status: ReachabilityStatus) in 
     switch status { 
     case .RealStatusNotReachable: 
      if operationQueue.operations.containsObject(operation1) { 
       for op in operationQueue.operations { 
        if op == operation1 { 
         op.cancel() 
        } 
       } 
      } 
      break 
     default: 
      operationQueue.addOperation(operation1) 
    } 

MISE À JOUR: Comme je l'ai rapport dans mon dernier commentaire essayer de déclarer:

var operationQueue = NSOperationQueue() 

sur une classe d'instance partagée ou à la appDelegate.

Par exemple sur la dernière solution que vous pouvez faire:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
let aVariable = appDelegate.someVariable 

et utilisez votre file d'attente où vous voulez autour de votre projet.

+0

Je veux arrêter l'exécution de la fonction GetDataFromServer() if (status == RealStatusNotReachable)! Vous me suggérez de recommencer à fonctionner! – Dmitry

+0

Alessandro Ornano, vous me suggérez d'enlever Observer ... mais j'ai besoin d'arrêter la fonction GetDataFromServer()! – Dmitry

+0

cela ne fonctionne pas = ( – Dmitry