我最近发现在我的iOS应用中制作非常自定义的布局时使用NSNotifications
的好处。我现在使用它们来发送数据而不是使用委托。例如,我在一个控制器中有一个UIScrollView
,它会改变另一个view controller
中图片的alpha值,所以我只是在滚动视图滚动时发送通知,例如
func scrollViewDidScroll(scrollView: UIScrollView) {
let userInfo = ["ScrollView":scrollView]
NSNotificationCenter.defaultCenter().postNotificationName("scrollViewScrolled", object: self, userInfo: userInfo)
}
在另一个视图控制器中观察这一点。我知道NSNotifications
在性能上并不昂贵,但是在我使用它们的程度以及我发送的数据中,我想知道它是否会被认为是不好的做法。
答案 0 :(得分:2)
这是一个关于应用程序设计的好问题。通知提供非常松散的耦合,如果不同的组件彼此不直接相关,则可以派上用场。
在我看来,大多数时候使用通知是一个糟糕的选择,基于糟糕的设计或懒惰。如果你看看你的代码,很难说它是如何连接的,谁负责什么等等。另外,它通过通知的方式非常不灵活。例如,考虑您要在另一个地方重用一个视图控制器 - 这可能不希望触发这些通知。现在下一个代码味道就在附近。您开始修改通知处理或数据只是为了让它运行并对抗副作用。
这并不是说通知很糟糕。它们有它们的用途,它可能适合这里和那里。大多数时候,这是一个丑陋的快速黑客,从长远来看会让事情闻起来(而且很难调试)。
答案 1 :(得分:2)
IMO它们应该用于谨慎的事件,例如表明某些事情已经完成。 即使没有性能损失,也不建议在事情发生变化时使用它们来发送连续的数据流。
它们提供了非常松散的耦合但是使用它们来提供非常松散的耦合只是为了提供松耦合是不好的设计在我的拙见中,它走得太远并且已经从设计模式转变为设计反模式。 如果没有必要也没有任何好处,那么将代码的不同部分松散耦合是毫无意义的。
答案 2 :(得分:0)
NSNotification应该用于通知另一个实体有关更改,而不是传递数据。您可以传递具有NSNotification的对象,以告知接收者有关通知的内容。
如果接收方收到通知,比方说,设置已更改。接收器可以根据传递的参数检查确切的变化,并采取相应的行动。
例如,如果数据已到达,您只需通知数据已到达,然后使用共享资源获取实际数据。共享资源可以是单例,数据库等等。希望这能让你清楚。