1

假设您在 Core Data 中为外卖餐厅建模。每个都Restaurant应该有一个phoneNumber属性,但它会根据用户的街道地址而有所不同。不过不用担心,有一个 REST API 可以帮助您将街道地址和餐厅 ID 转换为电话号码。

我想对联系 REST API 的phoneNumber属性进行建模Restaurants

  1. 仅在需要时(即phoneNumber访问属性时)
  2. 尽可能不频繁

我正在考虑的策略是这样的:

  1. phoneNumberLoaded在餐厅上提供符合 KVO 的布尔值
  2. 在卸载状态下nil访问时返回phoneNumber
  3. 开始异步加载phoneNumber属性:
    1. 第一次访问
    2. 当用户调用preloadPhoneNumber方法时
  4. 维护一个代表 API 接收预加载请求的队列,将它们分批处理
  5. 在 API 调用返回时更新phoneNumber,设置phoneNumberLoadedYES

我应该开始工作,还是有人有更好的策略?

4

1 回答 1

2

我不知道这是不是你的意思,但这就是我的看法:

Restaurant<<-->Address (city,street,needPhoneResolutoin[BOOL],phoneNumber[default value: nil])
创建一个处理分辨率的类 (PhoneResolver)。
解析器将有一个 FRC 实体:Address,谓词:needPhoneResolution == YES AND phoneNumber == nil
实现委托方法,但只处理插入的对象(以及第一次执行 fetch 调用后存在的所有对象)和删除的对象(清理)。
将它们批处理(在-controllerDidChangeContent:
执行 REST 提取
更新数据库。
向解析器报告失败(将需要另一个提取,或将地址标记为不可解析)。

这样,您不需要自己实现队列或 KVO(由 CoreData 提供),并且根据局部性原则,如果用户请求电话一次(并且获取失败),您仍然会保留用户请求该电话并尝试在每次启动解析器时获取它。

于 2013-04-19T18:59:49.383 回答