我来自 .NET Web 应用程序背景,刚刚开始 iOS 开发。我的应用程序的初始设计侧重于 NSNotificationCenter。我对此相当满意,直到我看到各种帖子解释如何到达 NSNotificationCentre 是一个常见的新手错误。
这是我要解决的问题的简化版本:
我的应用程序试图显示使用 Web 服务调用填充的消息列表,想想 Facebook 消息传递。
首次加载应用程序时,它会从服务器拉取一组消息并将它们显示在一个表格中给用户。用户可以添加新消息(通过 API 发回),应用程序可以接收有关添加到提要的新消息的推送通知。
消息永远不会保存到磁盘上,所以我只是使用 POCO 作为模型来保持简单。
我有一个 MessageFeedController 负责填充消息提要 View (在 Storyboard中)。我还有一个消息提要模型,它存储当前检索到的值并具有各种方法:
我目前的实现是这样的:
用例 1:初始负载
用例 2:新消息
用例 3:推送消息
在所有三种情况下,MessageFeed View 都会更新。除此之外,BadgeManager 还监听这些事件,这些事件负责设置应用程序图标角标(Badge)和标签栏角标(Badge),在这两种情况下,角标(Badge)编号都与未读消息的数量有关。
另一个 View 也可能打开并正在监听这些事件,该 View 包含消息摘要,因此需要知道集合何时更改。
是的,感谢您的支持,我的问题是:这似乎是对 NSNotificationCentre 的有效使用,还是我滥用了它?
我担心的一个问题是,如果消息集合在重新填充消息表的过程中发生变化,我不能 100% 确定会发生什么。我唯一能看到这种情况发生的情况是收到关于新消息的推送通知。在这种情况下,表格的人口是否必须在对 NSNotification 采取行动之前完成?
谢谢你的帮助
担。
最佳答案
换句话说,只要消息列表更新,您就会发布通知。这是对 NSNotificationCenter 的完全有效的使用。
另一种选择是使用 Key-Value Observing .
您的 Controller (和其他任何人)可以注册为“消息”属性的观察者,并且会在该属性更改时收到通知。在模型方面,您可以免费获得 KVO;只需调用一个名为 setMessages:
的方法将触发 KVO 更改通知。您还可以手动触发通知,如果需要,KVO 通知可以包括已添加、删除或更改的数组索引。
KVO 是执行此类更改通知的标准化方式。在使用 Cocoa Data Binding 实现 OS X 应用程序时尤为重要.
NSNotificationCenter 更加灵活,您可以将任何附加信息与每个通知捆绑在一起。
确保您的消息列表仅在主线程上更新,并且消息列表在没有发布相应的更改通知的情况下永远不会被修改,这一点很重要。您的 Controller 还应该注意忽略这些通知,只要它不是最顶层的 View Controller 或不在屏幕上。在 viewWillAppear:
中注册更改通知的情况并不少见。并在 viewWillDisappear:
中注销.
关于objective-c - 这是对 NSNotificationCenter 的有效使用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457423/