gpt4 book ai didi

ios - 核心数据多线程存储关系

转载 作者:可可西里 更新时间:2023-11-01 04:16:31 26 4
gpt4 key购买 nike

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

我正在制作有两个表的应用程序。我正在使用核心数据。表是类别产品,在核心数据中我建立了一对多关系 Category 可以有多个ProductProduct 可以有一个< em>类别

这是基本架构

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...))

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

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

然后是主要部分

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

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

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

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

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

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

然后我为每个类别执行此操作(在第 3 步中以 JSON 格式从服务器获取)

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

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

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

非常感谢

最佳答案

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

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

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

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

关于ios - 核心数据多线程存储关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11899875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com