每当iOS Swift中的对象发生更改时如何调用notificationCenter?

Posted

技术标签:

【中文标题】每当iOS Swift中的对象发生更改时如何调用notificationCenter?【英文标题】:How to call notificationCenter whenever changes made in object in iOS Swift? 【发布时间】:2020-03-05 10:03:21 【问题描述】:

我试图实现当对象更新时,Notificationcenter Post Message 应该在通知观察者处触发和接收。但在我的情况下,通知帖子在一个控制器中,而观察者在另一个控制器中。

这是来自 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 中调用通知观察者。什么都没收到。

任何帮助都非常感谢...

【问题讨论】:

【参考方案1】:

确保您的视图控制器已注册观察者。分享我运行良好的代码。我在 viewDidLoad 中添加了观察者。您可以在其他 ViewController 中调用 fetchDate 以在此观察者中传递流程。

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"

【讨论】:

【参考方案2】:

您的视图控制器是该通知的观察者吗?

如果没有:

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

@objc func myactionWhenReceivePost() 


答案更新后编辑:

当你添加一个观察者时,如果你注册了对象参数,它需要等于发送通知的对象。就像Notification.Name,如果不相等,您将不会收到任何通知。

另外:将您的操作参数从 NSNotification 更改为 Notification,因为我认为您使用的是 Swift 5.0

如果您想传递数据,请使用以[AnyHashable:Any]? 作为输入的 userInfo:

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 


【讨论】:

在哪里添加了 NotificationCenter.default.addObserver?在 ViewDidLoad 中? 在 viewDidload 和 viewDidAppear 中 @ParameswaranV 在您编辑后我已经更新了我的答案【参考方案3】:

在这里,您已经知道如何注册和取消注册通知,让我们从通知中获取自定义 userInfo

首先使用自定义用户信息发布通知:

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")

【讨论】:

如何在用户信息中发送结构模型类。

以上是关于每当iOS Swift中的对象发生更改时如何调用notificationCenter?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用swift从ios应用程序调用苹果钱包

我如何在 Swift iOS 中检测 UIImageView 中的更改图像

我如何更新我的字典 ios Swift 中的数量值

每当我的 json 数据文件更改时如何刷新页面

Facebook 中的 URL 更改 ajax 调用

当 Swift 中表格中的特定内容发生更改时更改表格的标题