gpt4 book ai didi

swift - 核心数据编码模式

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:53 26 4
gpt4 key购买 nike

我一直在使用带有 Entity Framework (EF) 的存储库设计模式来使用 C#,该模式允许我使用每个表的通用类与数据库进行交互。

enter image description here

这个存储库具有我需要的所有功能,例如:将新实体添加到数据库中、更新现有实体、删除实体、保存上下文等等...

例如,我在数据库中有一个名为“Person”的实体。我将创建一个名为 PersonRepository 的新类,它具有我需要更改/向数据库添加值的所有功能。

因此,要与数据库交互,您需要创建存储库类的实例。然后,这允许您调用此类的函数,这些函数又与数据库交互。这种模式的想法是,您对一个实体的所有数据库调用都被隔离到一个类中,这提高了可测试性和关注点分离。

我正在学习如何在我的 Swift 程序中使用 Core Data,它看起来类似于 C# 中的 EF。我已经在 .xcdatamodel 文件中创建了实体,并通过编辑器 > 创建 NSManageedObject 子类选项创建了关联的 Cocoa Touch 类。

我使用了“类别/扩展”CodeGen 选项,因此,我随后创建了一个名为“练习”的新类。据我所知,此类可以包含其他逻辑,例如重写 prepareForDeletion 方法。这是否意味着我可以将 addEntity、updateEntity 函数添加到此方法中,然后从其他代码文件中调用它们?

我的问题是:

  1. 我能否实现可在 C# 中使用的相同存储库模式?我相信这将在我的实体的生成类中(见下图)

  2. 我在哪里放置我所有的数据库调用函数?如果我可以使用这个存储库模式,我会把它们放在那里,但是,如果我不能,我是否将它们放在一个单独的代码文件中?我应该将它们放在为添加额外逻辑而创建的生成的实体文件中吗?

enter image description here

  1. 如果我可以使用存储库模式,有没有办法将上下文注入(inject)到此类中,或者每次我想更改它时是否都必须调用 getContext 方法?在 C# 中,每次我想对数据库进行更改时,我们都可以使用服务将上下​​文注入(inject)到类中——我不确定在 Swift 中是否可以这样做。

最佳答案

如果我理解正确的话,在 Swift 中,你的“存储库”类的等价物可能是两件事之一。它可能是核心数据的上下文,您将运行查询并将其保存到或(更有可能)您将创建一个新的类或结构来从业务方面掩盖核心数据。假设后者,您的“dataManager”类将执行与核心数据的所有交互。然后它可以将 NSmanagedobjects 返回给业务方,或者您可以映射/转换/转换为其他类型。

是的,Exercise 是 nsmanagedobject 的子类对象,因此它具有托管对象的所有核心数据功能,但您可以添加任何您想要的自定义函数。

您的数据管理器类将执行查询并返回正确的对象。例如 datamanger.getExercises() -> [Exercises], dataManager.save(_ exercise: Exercise) 等....

您需要在您的模式中考虑线程安全。一种选择是将 nsmanagedobjects 转换为数据管理器中的结构,而不返回 nsmangedobjects。结构是线程安全的,使用 codable 可以轻松地在 exerciseManagedOjbect 和 exerciseStruct 之间进行转换。此外,通过这个 dataManager 类示例,您可以在未来移除核心数据以用于另一个持久性选项,从而减少对您的应用程序的整体影响。

关于swift - 核心数据编码模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51849290/

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