2016-08-15 4 views
9

У меня есть 2 ViewControllers в моем приложении. Один из них по имени vcA использует метод (здесь viewDidLoad), чтобы поговорить с моим сетевым уровнем (класс в моем приложении). После завершения сетевого задания (которое будет выведено обработчиком завершения) я хочу уведомить класс vcB о вызове метода для получения некоторых данных, которые предоставляются сетевым уровнем. Пожалуйста, обратите внимание на ниже SUDO код:Swift: Уведомление ViewController от другого с помощью обработчика завершения

class Networking { 

    static var PublicValue : SomeKindOfClass? = nil 

    static func test(completionHandler : (successful : Bool) -> Void) -> Void { 
     //Do some networking in background 
     Network.BackgroundNetworking() { 
     if result = true { 
      PublicValue = SomeValue 
      completionHandler(successful : true) 
     } 
     else { 
      completionHandler(successful : false) 
     } 
    } 
} 

class vcA : UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     Networking.test(completionHandler : { (successful) in 
     if successful == true { 
      //Here I want to notify class vcB to call printPublicValue method 
     } 
     }) 
    } 
} 

class vcB : UIViewController { 

    func printPublicValue() { 

     print(Networking.PublicValue) 
    } 
} 
+2

Используйте NSNotifications – Paulw11

+0

спасибо , Я читал об этом здесь, но я не могу понять, в чем разница. B/W NSNotifications & NSNotificationCenter & performSelector & KVO, и какой из них подходит для моего случая? –

ответ

9

Я согласен с @ Paulw11 вы должны рассмотреть возможность использования NSNotifications. Их легко настроить и использовать, и они будут отлично работать в этой ситуации. Для этого в одном из ваших контроллеров отображения поместите следующий код:

NSNotificationCenter.defaultCenter().postNotificationName("nameOfNotification", object: nil) 

В вашем втором контроллере представления (тот, который будет получать уведомления) положенный:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(NameOfViewController.nameOfFunction(_:)), name: "nameOfNotification", object: nil) 

Тогда вы можете создать функция следующим образом:

func nameOfFunction(notif: NSNotification) { 
     //Insert code here 
} 

Существует большой учебник здесь, если вы хотите пойти более подробно:

https://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/

EDIT: Swift 3 Реализация этого.

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "nameOfNotification"), object: nil) 

В вашей второй контроллер представления (тот, который будет получать уведомления) положенный:

NotificationCenter.default.addObserver(self, selector: #selector(self.nameOfFunction), name: NSNotification.Name(rawValue: "nameOfNotification"), object: nil) 

Тогда вы можете создать функцию следующим образом:

func nameOfFunction(notif: NSNotification) { 
     //Insert code here 
} 
+0

Спасибо за ваш ответ. Это сработало для меня. Но что произойдет, если я хочу добавить наблюдателя B из класса A? То, что я действительно хочу сделать, это вызвать метод 'viewDidLoad' класса B, когда класс A завершил работу с помощью обработчика завершения. –

+3

Вы никогда не должны вызывать 'viewDidLoad' контроллера просмотра напрямую. Если у вас есть ссылка на экземпляр B, вы можете установить объект в качестве наблюдателя (первый аргумент 'addObserver'), но в целом класс должен управлять своими собственными наблюдениями. Поскольку вы говорите, что хотите называть 'viewDidLoad', на самом деле вы должны запускать segue от A до B (или представлять B), когда данные извлекаются, и в этом случае вам не нужны NSNotifications – Paulw11

+0

У меня есть UITabBarViewController, поэтому я хочу, чтобы он попросил сетевой слой получить все данные для меня. После этого процесса я хочу уведомить каждую из своих вкладок, что их данные готовы к использованию. Но, как вы знаете, это только первый элемент ViewController, который добавлен в качестве наблюдателя (другие вкладки еще не загрузились!). Есть ли способ справиться с этим, или я полностью ошибаюсь? –