核心数据多线程商店关系

时间:2012-08-10 10:33:14

标签: ios multithreading ios5 core-data entity-relationship

我的问题很奇怪,我正在寻求帮助。我想向您解释我的系统是如何工作的。我有两个问题。

我正在制作有两张桌子的应用程序。我正在使用核心数据。表格 类别 产品 ,在核心数据中,我建立了一对多的关系 类别 可以有多个 产品 产品 可以有一个 < EM>产品分类

这是基本架构

Category {
  site_id
  name
  allProducts ->> Product
}

Product {
  site_id
  name
  category -> Category
}
  • 这是简单的模型产品,而catwegories有更多的属性

在该应用程序中,我有更新过程,该过程在backgournd线程中工作。我已经为该线程创建了上下文以及我在该上下文中存储的所有更改。

我在

中的后台线程中执行的所有caluclation
[context performBlock:^{
  // all my operations for updating storing categories and products
}]

这是更新过程的流程

  1. 从服务器获取带有类别数据的JSON
  2. 从服务器获取带有产品数据的JSON
  3. 从服务器获取JSON,其中包含哪些类别的产品array((category_site_id > array(product_site_id1, product_site_id2...))

  4. 通过类别JSON和商店类别实体,我从JSON获取名称和site_id并创建实体并设置这些属性

  5. 传递产品JSON并创建产品实体,并从JSON中的属性设置名称和store_id

  6. 然后是主要部分

    1. 现在我需要根据步骤3中的JSON将产品连接到类别,这是一个问题。
    2. 我将从JSON获取foreach类别并将所有产品site_id作为NSArray,我使用带有谓词和IN条件的获取请求来从上下文中获取具有site_id IN数组的所有产品实体。但我总是得到零结果。这很奇怪,因为我在后台线程中调用上下文中的fetch结果,并且我还在步骤3和4中更新了该上下文。

      然后我尝试接下来的事情,在第6步之前我[context save:&error]并且在大约30秒后加入睡眠,并且在该程序进入第6步之后,所有工作都会完成我的获取结果,获得带有IN标准的谓词的产品。这是我的第一个问题,如果你了解我,我无法通过ID获取产品,我需要等待大约30秒才能将上下文存储到SQLLiteDB,这很奇怪。这也很奇怪,因为当我想通过id获取带有获取请求的类别时,我可以毫无问题地获得它 (也许这是因为第5步需要大约一分钟)。

      我的下一个问题是,当我等待30秒,然后通过各种类别。基于类别site_id,我从上下文获取Category实体,并且在步骤6中,我获得所有基于JSON和获取请求的产品site_ids的产品,现在我想将产品添加到类别,我打电话给下一个

      [category setAllProducts:results] //结果是产品的NSSet,类别是实体对象

      NSError * error = nil; [上下文保存:&amp;错误];

      我做的是foreach类(从服务器以JSON格式在步骤3中执行)

      当一切都完成后,我无法在UI上看到类别中的产品我也在等待一段时间将所有数据存储在数据库中,但没有任何内容,

      然后当我停止申请并再次运行时,我可以看到类别中的产品:(

      很奇怪的问题请帮帮我,我不知道我哪里错了。我可以发布部分代码,代码不小,我根据流程描述请求帮助。

      非常感谢

1 个答案:

答案 0 :(得分:13)

我的理解是你正在使用儿童语境。儿童情境会受到许多(很多!)错误的影响。

这里有关于该主题的非常好的文章:

http://wbyoung.tumblr.com/post/27851725562/core-data-growing-pains

我对此问题的建议是使用直接连接到商店协调员的上下文,而不是子上下文。使用这样的设置一切都会正常工作。当然,您可以使用专用队列上下文。