2017-01-01 2 views
0

mon application est basée sur un TabBarController avec 4 ViewControllers. Tous les 4 sont dépendants des mêmes données. C'est pourquoi je voudrais charger les données au début de l'application dans AppDelegate.Swift: demande réseau à AppStart dans AppDelegate - CompletionHandler dans ViewController?

Cependant, comment le ViewController sait-il que la requête est terminée? Par exemple, s'il y a une erreur (par exemple, pas de connexion Internet), comment transmettre cette erreur à l'un de ces 4 ViewController pour présenter une alerte?

+0

Utilisez NSNotificatioCenter pour afficher une notification (appelée "DataIsReady") lorsque vos données est prêt, une autre notification (par exemple, appelé "ErrorOccurs") quand il est erreur, tous les contrôleurs de vue observent les notifications et les gèrent. – bubuxu

Répondre

0

Utilisez NotificationCenter pour mettre en œuvre (Swift 3 code):

extension Notification.Name { 
    static var RequestCompleted = Notification.Name(rawValue: "MyRequestIsCompleted") 
    static var RequestError = Notification.Name(rawValue: "MyRequestError") 
} 

class DataRequest { 

    func request() { 

     // if there is error: 
     let error = NSError(domain: "Error Sample", code: 0, userInfo: nil) 
     NotificationCenter.default.post(name: .RequestError, object: error) 

     // if the request is completed 
     let data = "your data is here" 
     NotificationCenter.default.post(name: .RequestCompleted, object: data) 

    } 

} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(self, selector: #selector(requestCompleted(_:)), name: .RequestCompleted, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(requestError(_:)), name: .RequestError, object: nil) 

    } 

    deinit { 
     NotificationCenter.default.removeObserver(self) 
    } 

    func requestCompleted(_ notification: Notification) { 
     if let obj = notification.object { 
      print(obj) 
     } 
    } 

    func requestError(_ notification: Notification) { 
     if let obj = notification.object { 
      print(obj) 
     } 
    } 

} 
+0

Si votre classe DataRequest est un objet singleton, vous pouvez enregistrer les données de la requête dans un iVar et ne pas avoir besoin de passer dans l'appel (dans le gestionnaire, l'obj sera vide mais vous pouvez y accéder depuis la classe singleton) – bubuxu