NSNotificationCenter addObserver 在 Swift 中调用私有方法

Posted

技术标签:

【中文标题】NSNotificationCenter addObserver 在 Swift 中调用私有方法【英文标题】:NSNotificationCenter addObserver in Swift while call a private method 【发布时间】:2014-10-21 09:15:56 【问题描述】:

我使用addObserver API 接收通知:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)    

我的方法是:

func methodOFReceivedNotication(notification: NSNotification)
//Action take on Notification
    

是的,它有效! 但是当我将方法 methodOFReceivedNotication 更改为私有时:

private func methodOFReceivedNotication(notification: NSNotification)
//Action take on Notification
    

xCode 发给我一个错误:unrecognized selector sent to instance

如何在目标为self 时调用私有方法?我不想将methodOFReceivedNotication 方法暴露给任何其他人。

【问题讨论】:

【参考方案1】:

只需使用dynamic 修饰符标记它或在方法声明中使用@objc 属性

dynamic private func methodOFReceivedNotication(notification: NSNotification)
    //Action take on Notification

@objc private func methodOFReceivedNotication(notification: NSNotification)
    //Action take on Notification

【讨论】:

这对我有用,添加了动态,但为什么呢?这是怎么回事? @StevenMarlowe,这篇文章(link) 可能会有所帮助。 好答案+文章@YiminLin 我只是认为动态关键字应该是第一个选项(因为它不是“解决方法”)【参考方案2】:

您是否考虑过使用-addObserverForName:object:queue:usingBlock:

NSNotificationCenter.defaultCenter().addObserverForName("NotificationIdentifier", object: nil, queue: nil, usingBlock: 
    [unowned self] note in
    self.methodOFReceivedNotication(note)
)

或者不调用私有方法,只执行操作。

NSNotificationCenter.defaultCenter().addObserverForName("NotificationIdentifier", object: nil, queue: nil, usingBlock: 
    [unowned self] note in
    // Action take on Notification
)

【讨论】:

我喜欢这个解决方案,因为 Swift 非常重视“安全”,并且能够显式调用方法而不是为方法名称提供带引号的字符串(对于选择器)更安全.那么如果你稍后更改方法签名,你实际上会遇到编译错误而不是运行时错误。

以上是关于NSNotificationCenter addObserver 在 Swift 中调用私有方法的主要内容,如果未能解决你的问题,请参考以下文章

WiFi网络更改是不是有NSNotificationCenter通知?

NSNotificationCenter传值

消息通信机制NSNotificationCenter -备

NSNotificationCenter 内存泄漏

如何在 iOS 8 中使用带有 NSNotificationCenter 的小部件

关闭时未收到 NSNotificationCenter 通知