【问题标题】:Strategy for [lazy-]loading Core Data properties asynchronously[lazy-] 异步加载 Core Data 属性的策略
【发布时间】:2013-04-13 02:51:06
【问题描述】:

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

我想对RestaurantsphoneNumber 属性建模,以便联系REST API:

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

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

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

我该去上班,还是有人有更好的策略?

【问题讨论】:

    标签: objective-c core-data asynchronous properties transient


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多