2017-01-01 6 views
0

мое приложение основано на TabBarController с 4 ViewControllers. Все 4 из них зависят от одних и тех же данных. Вот почему я хотел бы загрузить данные в App App в AppDelegate.Swift: Network-Request в AppStart в AppDelegate - CompletionHandler в ViewController?

Однако, как ViewController знает, что запрос завершен? Например, если есть ошибка (например, нет подключения к Интернету), как передать эту ошибку любому из этих 4 ViewController для уведомления?

+0

Используйте NSNotificatioCenter, чтобы опубликовать уведомление (так называемый "DataIsReady"), когда ваши данные будут готовы, еще одно уведомление (например, под названием "ErrorOccurs"), когда есть ошибка, все контроллеры просмотра наблюдают за уведомлениями и обрабатывают их. – bubuxu

ответ

0

Использование NotificationCenter для реализации (Swift 3-код):

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

Если ваш класс DataRequest является одноэлементным объектом, вы можете сохранить данные запроса в iVar и не нуждаться в передаче в пост-вызов (поэтому в обработчике obj будет пустым, но вы можете получить к нему доступ из класса singleton) – bubuxu