[lazy-]异步加载Core Data属性的策略

时间:2013-04-19 16:25:54

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

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

我想对phoneNumber的{​​{1}}属性进行建模,以便联系REST API:

  1. 仅在需要时(即访问Restaurants属性时)
  2. 尽可能不频繁
  3. 我正在考虑的策略是这样的:

    1. 在餐馆
    2. 上提供符合KVO的phoneNumber布尔值
    3. 在卸载状态下访问phoneNumberLoaded时返回nil
    4. 开始以异步方式加载phoneNumber属性:
      1. 第一次访问
      2. 当用户调用phoneNumber方法
    5. 维护一个队列,代表API接收预加载请求,对其进行批处理
    6. 在API调用返回时更新preloadPhoneNumber,将phoneNumber设置为phoneNumberLoaded
    7. 我可以上班,还是有人有更好的策略?

1 个答案:

答案 0 :(得分:2)

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

餐厅<< - >地址(城市,街道,needPhoneResolutoin [BOOL],phoneNumber [默认值:nil])
创建一个将处理分辨率的类(PhoneResolver) 解析器将具有带实体的FRC:Address,谓词:needPhoneResolution == YES AND phoneNumber == nil 实现委托方法,但只处理插入的对象(以及第一次执行提取调用后存在的所有对象)和已删除的对象(清理)。
批量处理(-controllerDidChangeContent:
执行REST获取
更新数据库。
报告无法解析(需要进行另一次提取,或将地址标记为无法解析)。

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