【问题标题】:Core Data multithread store relationsCore Data 多线程存储关系
【发布时间】:2012-08-07 15:36:10
【问题描述】:

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

我正在制作有两个表的应用程序。我正在使用核心数据。表格是CategoriesProducts,在核心数据中我已经建立了一对多关系类别可以有多个产品产品可以放一个类别

这是基本架构

Category {
  site_id
  name
  allProducts ->> Product
}

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

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

我在后台线程中执行的所有计算

[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...))987654323@

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

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

然后是主要部分

  1. 现在我需要根据在第 3 步中获得的 JSON 将产品连接到类别,这有一个问题。

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

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

我的下一个问题是当我等待 30 秒然后通过 trought 类别时。根据类别 site_id,我从上下文中获取类别实体,并且在第 6 步中,我根据 JSON 获取的产品 site_id 获取所有产品并获取请求,现在我想将产品添加到类别中,然后调用 next

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

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

我为每个类别做那个(在第 3 步中从服务器以 JSON 格式获取)

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

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

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

非常感谢

【问题讨论】:

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


    【解决方案1】:

    我的理解是您使用的是子上下文。子上下文受到您必须处理的许多(许多!)错误的影响。

    关于该主题的相当不错的文章在这里:

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

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

    【讨论】:

    • 是的,当我在类似NSManagedObjectContext *asyncContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 的线程中创建conext 时,我添加了父上下文asyncContext.parentContext = mainDocument.managetContextObject,类似这样的问题,可能这是个问题。
    • 我今天会和商店协调员一起尝试,但我不知道该怎么做,你能给我一些例子或教程吗?非常感谢
    • 嗨,我使用了存储协调器,现在一切正常,我不需要等待数据存储到数据库,并且在更新所有 ui 元素后所有数据都已正确重新加载。再次非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2014-12-23
    • 1970-01-01
    • 2016-04-07
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多