同时从服务器获取数据并在数据到达时修改核心数据图的最佳方法?

时间:2013-10-24 01:53:14

标签: ios core-data ios7 nsmanagedobjectcontext

我在一个将coredata与服务器请求相结合的应用程序中重写了一大段代码。我正在尝试找出最佳方法,以便在新服务器请求返回新JSON时我可以同​​时更新对象。顺便说一句,如果iOS7使解决方案更好,请随意假设代码只需要与iOS7兼容。

这是一个基本用例:

假设我的User实体具有idname属性以及2个M2M(用户/用户)关系:friends.和呃... {{1 }}?肯定。

因此应用程序启动。内存中的图形和SQL持久性存储都没有。我要求检索id为15的用户及其朋友和恶魔。

接下来会发生什么:

  1. CD使用fiends类型的谓词对User进行抓取。
  2. 没有任何内容返回,因此它为以下服务器端点排列了3个AFRequests: A: id = 15(这将获取用户属性,/users/15和{{1} }), B: id(关系)和 C: name(关系)。这3个请求是并发的。
  3. 任何这些请求返回的那一刻(使用用户的JSON表示或关系的朋友/恶魔数组),我查询CD上下文以查看JSON有效负载中的任何对象是否已存在于CD中。如果确实(在后续服务器调用中会发生),我会使用服务器中的任何新数据更新它们(包括建立关系,如果适用)。如果没有,我在CD上下文中创建一个新的托管对象,并从JSON填充属性/关系。在这种情况下,对象的创建和标识始终基于其users/15/friends属性。
  4. 无论哪种方式,当我完成后,我保存了CD上下文。
  5. 从上面看,每次JSON从服务器返回时,我都会创建或更新相应的托管对象并保存。问题是,对于此示例,相同的上下文将获得3个可能并发的调用:创建用户15和/或填充其users/15/fiends,创建用户15和/或填充其id,创建用户15和/或更新其名称和ID。

    我最初的计划是:

    1. 一个接一个地做出3个AFRequests(我假设它进入并发队列,因此会并发执行)
    2. 将请求的完成块全部分派到同一个GCD并发队列中。
    3. 让每个GCD块创建一个新的CD上下文,执行插入/更新,然后调用save
    4. 让主CD上下文合并主线程中的更改。
    5. 但是现在我只是读一下friendsfiends的两个队列并发类型以及子上下文的概念,我还没有完全理解它。所以我想知道,我的原始计划是否可行?

      我能想到的几个问题是:

      • 对于步骤3,是否更好地为每个GCD块创建主要上下文的子上下文NSManagedObjectContext
      • 如果是这样,我还需要GCD队列吗?也就是说,我是否应该使用-performBlock:的单个上下文而不是通过GCD进行调度,只需执行NSPrivateQueueConcurrencyType

0 个答案:

没有答案