gpt4 book ai didi

swift - 在上下文之外创建 NSManagedObject

转载 作者:行者123 更新时间:2023-11-28 06:20:16 25 4
gpt4 key购买 nike

我已经阅读了很多关于这个问题的主题,但没有真正找到合适的答案。我想在没有上下文的情况下创建 NSManagedObject 的实例。

原因如下:应用从服务器获取 soap 应答。这个答案必须保存到核心数据中。答案看起来像一棵树。

我的想法是为每个实体覆盖 init 以便它获取数据。之后,我将能够创建根实体,根实体的创建将调用另一个实体的创建,依此类推。

负责发出请求的应用程序部分是通过泛型实现的。有描述每个响应类必须具有的 init 的协议(protocol),例如。例如:

public protocol Parsable {
init(data: Data)
}

如您所见,这里没有上下文的余地。相反,我想创建所有这些实体并将其一次性保存到上下文中。

此处的替代解决方案是创建重复的类,用响应填充它,然后将其复制到我的核心数据实体中。但这是我想避免的不必要的重复。

任何想法将不胜感激。

最佳答案

实际上,出于很多原因,“这里的替代解决方案是创建重复的类”是唯一好的解决方案。

在您的情况下,您似乎已经有 2 个代表同一实体的此类对象。我假设您从服务器收到的是解析为字典的 JSON。这是一个代表同一个实体的对象。因此,要将其传输到核心数据中,您已经拥有 1 个从字典到核心数据管理对象的映射器。

假设托管对象适合直接在更高级别的应用程序中使用是错误的。我们为此使用包装器。因此,您需要一个类来处理所有数据传输,然后让所有接口(interface)都可以在任何模块和任何线程中使用数据。这就是为什么您需要将所有数据传输到一个可能包装托管对象的新类。

假设您有一个名为 MyObject 的类和一个核心数据类 MyObjectEntity,可能还有一个 API 字典。那么 MyObject 的接口(interface)将是:

init(entity: MyObjectEntity) // Wraps the entity and copies all fields to this class
init(descriptor: [String: Any]) // Copies all fields to this class
var descriptor: [String: Any] // Returns a dictionary ready to be parsed to JSON
func writeToManagedObject() // Will copy all the data to managed object. If the object exists it will modify it, if not it will create a new one. This will not save the database.

通过一些子类化和一些扩展,您可以创建一个非常好的系统,即使您有许多需要映射的模型。并且由于此类随后对从任何线程访问和/或保存上下文完全不敏感,因此它已准备好进行任何其他高级操作。据我所知,您甚至可以将其用作 MVVM。

关于swift - 在上下文之外创建 NSManagedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43819114/

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