在UILabel中显示核心数据计数,不断更新

时间:2014-01-13 11:11:00

标签: ios core-data uilabel nsmanagedobject

给定一个名为Book的核心数据实体,总共可以计算多少Book的最佳方法,并在UILabel中显示此总数? UILabel需要在创建/删除书籍对象时更新(可能是应用程序中其他对象)。

实际上计算书籍并不困难。我的问题是,当这个数量发生变化时,我们如何得到更新?

  • 也许覆盖Book托管对象上的willSave / delete / etc?
  • KVO(但我们如何在整个实体而不是单个对象上执行此操作?)
  • 别的什么?

3 个答案:

答案 0 :(得分:3)

您可以收听与核心数据更改相关的通知(NSManagedObjectContextObjectsDidChangeNotification),并从中更新您的用户界面。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDataModelChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:myManagedObjectContext];

- (void)handleDataModelChange:(NSNotification *)notification;
{
  NSSet *updatedObjects  = notification.userInfo[NSUpdatedObjectsKey];
  NSSet *deletedObjects  = notification.userInfo[NSDeletedObjectsKey];
  NSSet *insertedObjects = notification.userInfo[NSInsertedObjectsKey];  

  // update your UI with the new count
}

注意:别忘了删除自己,

- (void)dealloc;
{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

答案 1 :(得分:1)

您可以创建 NSFetchedResultsController 来获取 book 对象,然后实现它的委托方法。参考:

NSFetchedResultsController

NSFetchedResultsControllerDelegate Protocol

答案 2 :(得分:0)

如前所述,您可以订阅NSManagedObjectContextObjectsDidChangeNotification并尝试分析它。我认为这有两个缺点。首先,在任何对象的任何更改中都会调用此通知。在发生更改时,呼叫不会真正发生,但此通知中仍会报告任何更改。其次,订户需要知道创建新书的所有上下文。您可能会考虑使用nil订阅此通知,以便上下文接收所有上下文的此通知。但这更加压倒性和危险,并不是苹果公司推荐的(你也会收到这个通知也适用于你不拥有的情况)。

我建议每个创建图书的地方都有自己的通知。与XYBookAddControllerDidAddBookNotificationXYBookListControllerDidDeleteBookNotification等相同。在这种情况下:

  1. 显示计数的位置无需知道有关更改的上下文的任何信息。
  2. 显示的位置仅响应特定的添加/删除事件,而不是分析对象的大量流量 - 更改通知。