核心数据multithreading存储关系

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

我正在申请有两张桌子。 我正在使用核心数据。 表是类别产品 ,在核心数据中我已经build立了一对多的关系类别可以有多个产品产品可以捧一个Categroy

这是基本的模式

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

在那个应用程序中,我有更新过程,并且该过程在后台线程中工作。 我已经创build了该线程的上下文,以及我在该上下文中存储的所有更改。

所有的调用我在后台线程中执行

 [context performBlock:^{ // all my operations for updating storing categories and products }] 

这是更新过程的stream程

  1. 从服务器获取JSON与类别数据
  2. 从服务器获取JSON与产品数据
  3. 从服务器获取JSON与类别具有哪些产品array((category_site_id > array(product_site_id1, product_site_id2...))

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

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

然后是主要部分

  1. 现在我需要将产品连接到基于步骤3中的JSON的类别,这是一个问题。

我要从JSON的foreach类,并获得所有产品site_id作为NSArray,我正在使用谓词和IN标准的获取请求,以获取所有产品实体从上下文有site_id IN数组。 但是我总是得到零结果。 这很奇怪,因为我在后台线程上调用上下文获取结果,我也在步骤3和4中更新了上下文。

然后,我尝试下一步,在第6步之前[context save:&error]并添加了大约30秒的睡眠时间,并且在程序运行到第6步之后,所有工作都取得了结果。 这是我的第一个问题,如果你了解我,我不能通过身份证获得产品,我需要等待大约30秒,上下文存储到SQLLiteDB这是非常奇怪的。 这也很奇怪,因为当我想通过id获取请求的类别时,我可以毫无问题地得到它(也许这是因为步骤5需要大约一分钟)。

我的下一个问题是等待30秒,然后通过分类。 根据类别site_id我从上下文获得类别实体,并在第6步我得到的所有产品基于产品site_ids由JSON geted和获取请求,现在我想添加产品类别,我打电话next

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

NSError * error = nil; [context save:&error];

我做了这个foreach分类(在步骤3中从服务器以JSON格式生成)

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

然后当我停止应用程序,并再次运行,我可以看到产品类别:(

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

非常感谢你

我的理解是你正在使用儿童情况。 子环境受许多( 许多! )错误的影响,你必须处理。

这里有关于这个话题的很好的文章:

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

我在这方面的build议是使用直接连接到商店协调员的上下文,而不是儿童上下文。 一切都会正常使用这样的设置。 当然你可以使用私有队列上下文。