Как вызвать центр уведомлений, когда изменения в объекте iOS Swift? - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь добиться, когда обновляется объект, сообщение Notificationcenter Post должно сработать и получить уведомление у наблюдателя. Но в моем случае сообщение с уведомлением находится в одном контроллере, а наблюдатель - в другом контроллере.

Вот мой код для сообщения уведомления от webViewController:

  if let jsonData = jsonString.data(using: .utf8) {
              do {
                let decoder = JSONDecoder()
                let mainObject = try decoder.decode(DynamicTabsModel.self, from: jsonData)

                print("tab model:::", mainObject)


                let dataDict:[AnyObject] = mainObject.tabInfo.tabList as [AnyObject]

                print("data object for tab", dataDict)


                NotificationCenter.default.post(name: Notification.Name("updateParentViewController"), object: mainObject)



              } catch {

                print(error.localizedDescription)

              }
            }

Вот код для CreateCardViewController, где я получаю Наблюдатель уведомлений:

 NotificationCenter.default.addObserver(self, selector: #selector(self.updateParentViewController(_:)), name: Notification.Name(rawValue: "updateParentViewController"), object: nil)


   @objc func updateParentViewController(_ notification: NSNotification){


    if let receivedData = notification.object as? DynamicTabsModel {
    //use received data
        print("recieved back data:::", receivedData)

        for d in receivedData.tabInfo.tabList {

            print(d.label )
            self.tabMenuAry.append(d.label)


        }
        initCarbonKitTab()

        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "updateParentViewController"), object: nil)

        print("tab menu array::", self.tabMenuAry)


    }

}

Мой вопрос: всякий раз, когда происходят изменения в объектной модели, он должен вызывать метод публикации уведомлений и получать наблюдателя.

Я пытался вызвать наблюдателя уведомлений в viewdidload, viewdidappear и viewwillappear. Ничего не получил.

Любая помощь высоко ценится пожалуйста ...

Ответы [ 3 ]

0 голосов
/ 05 марта 2020

Убедитесь, что ваш контроллер вида зарегистрировал наблюдателя. Поделиться моим кодом, который работает нормально. Я добавил наблюдателя в viewDidLoad. Вы можете вызвать fetchDate в другом ViewController, чтобы передать поток в этом наблюдателе.

import Foundation
import UIKit
// MARK: - Observers

class MyViewController: UIViewController {
    override func viewDidLoad() {
        addObservers()
    }
    deinit {
        removeObservers()
    }
    @objc func notificationAction() {

    }
}

// MARK:- APIHandler
extension MyViewController {
    func fetchData() {
        // Call API when you get success response, post notification
        // NotificationCenter.default.post(name: NSNotification.Name(rawValue: NOTIFICATION_NAME.MY_NOTIFICATION), object: nil)
    }
}
extension MyViewController {
    func addObservers(){
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(notificationAction),
            name: NSNotification.Name(rawValue: NOTIFICATION_NAME.MY_NOTIFICATION) ,
            object: nil
        )
    }
    func removeObservers(){
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue:NOTIFICATION_NAME.MY_NOTIFICATION), object: nil)
    }
}

enum NOTIFICATION_NAME{
    static let MY_NOTIFICATION = "myNotification"
}
0 голосов
/ 05 марта 2020

Здесь вы go, поскольку вы уже знаете, как зарегистрироваться и отменить регистрацию для уведомлений, давайте получить пользовательскую информацию пользователя из уведомления

сначала опубликовать уведомление с пользовательской информацией пользователя:

let customUserInfo: [AnyHashable: Any] = ["value": YOUR_CUSTOM_OBJECT]
NotificationCenter.default.post(name: .myNotificationName, object: nil, userInfo: customUserInfo)

Теперь, когда вы хотите поймать это уведомление и нуждаетесь в этой информации, используйте это в контроллере приемника

@objc func onNotificationCatched(notification:NSNotification) {
    let userInfo:Dictionary<String, YOUR_CUSTOM_OBJECT > = notification.userInfo as! Dictionary<String, YOUR_CUSTOM_OBJECT>
    let value = userInfo["value"]! as YOUR_CUSTOM_OBJECT
    print(value)

}

в viewDidLoad контроллера приемника, используйте это

NotificationCenter.default.addObserver(self, selector: #selector(onNotificationCatched(notification:)), name: .myNotificationName, object: nil)

для простоты использования NSNotifications Name , сделайте расширение

extension NSNotification.Name {

static let myNotificationName = NSNotification.Name(rawValue: "My-Custom-Notification_String-Name")

}

0 голосов
/ 05 марта 2020

Является ли ваш viewcontroller наблюдателем для этого уведомления?

Если нет:

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

@objc func myactionWhenReceivePost() {

}

Изменить после обновления ответа:

Когда вы добавляете наблюдатель, если вы зарегистрируете параметр объекта, он должен быть равен объекту, отправленному после отправки уведомления. Это как Notification.Name, если оно не равно, вы не получите никакого уведомления.

Кроме того: измените параметр своего действия с NSNotification на Notification, поскольку я думаю, что вы используете Swift 5.0

Если вы хотите передавать данные, используйте userInfo, который принимает [AnyHashable:Any]? как введите:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateParentViewController"), object: nil, userInfo: yourDictionary)

и в вашем действии:

@objc func myactionWhenReceivePost(_ notification: Notification) {
      guard let myObject = notification.userInfo?["myObject"] as? MyObject else {return }

}
...