objective-c - 这是对 NSNotificationCenter 的有效使用吗

标签 objective-c ios ios5

我来自 .NET Web 应用程序背景,刚刚开始 iOS 开发。我的应用程序的初始设计侧重于 NSNotificationCenter。我对此相当满意,直到我看到各种帖子解释如何到达 NSNotificationCentre 是一个常见的新手错误。

这是我要解决的问题的简化版本:

我的应用程序试图显示使用 Web 服务调用填充的消息列表,想想 Facebook 消息传递。

首次加载应用程序时,它会从服务器拉取一组消息并将它们显示在一个表格中给用户。用户可以添加新消息(通过 API 发回),应用程序可以接收有关添加到提要的新消息的推送通知。

消息永远不会保存到磁盘上,所以我只是使用 POCO 作为模型来保持简单。

我有一个 MessageFeedController 负责填充消息提要 View (在 Storyboard中)。我还有一个消息提要模型,它存储当前检索到的值并具有各种方法:

  • (void) loadFromServer;
  • (void) createMessage: (DCMMessage*) 消息;
  • (void) addMessage: (DCMMessage*) 消息;
  • (NSArray*) 消息;
  • (int) 未读消息;

  • 我目前的实现是这样的:

    用例 1:初始负载
  • 当 View 首次出现时,会调用“loadFromServer”方法。这会填充消息集合并引发 NSNotificationCenter 事件。
  • Controller 观察到这个事件,并在收到它时填充 tableview

  • 用例 2:新消息
  • 当用户单击“添加”按钮时,会出现一个新 View ,他们输入他们的消息,点击发送,然后 View 被关闭。
  • 这将调用模型上的 createMessage 方法,该方法调用 API
  • 一旦我们得到响应,模型就会引发 NSNotificationCenter 事件
  • MessageFeedController 再次监听此事件并重新填充表

  • 用例 3:推送消息
  • 应用程序打开时收到推送通知,其中包含新消息详细信息
  • AppDelegate(或其他类)将调用模型上的 addMessage 方法,将其添加到集合
  • 再一次,假设 MessageFeed View 是打开的,它会重新填充

  • 在所有三种情况下,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/

    相关文章:

    ios - 从 ipad 本地主机上的 Web 服务器运行 jupyter notebook

    带有开发人员配置文件的设备上的 iphone ipa 文件 - 它将部署在不同 MAC 机器上的设备上

    ios - 当我为我的 iOS 应用程序运行我的代码时,它停止了,就好像我设置了一个断点(没有错误)并且不会继续运行

    objective-c - 使用 NSScanner 进行高效的 NSString 解析

    ios - 如何在不使用Api的情况下在uitableview中进行分页?

    iOS - AVPlayer seekToTime 重新开始播放 currentItem

    objective-c - 下划线的合成为什么不起作用?

    ios - UITapGestureRecognizer initWithTarget :action: method to take arguments?

    ios - 在不可见的 View Controller 上强制旋转的最佳方法是什么?

    ios4 - 我的应用程序无法在iOS 5上运行。是否必须从应用程序商店中将其删除?