为模型创建一个抽象层

您是否在iOS开发中见过模型的不同层? 我从来没有。 例如,当使用Core Data时,我们通常直接在视图中操作NSManagedObject 。 那不理想。 因此,我一次研究了如何为模型创建抽象层。

为什么要使用其他型号?

我正在使用Core Data将数据存储在我们的应用程序中记住。 要创建核心数据模型,我需要在NSManagedObject构造函数中注入NSManagedObjectContext对象。 问题是我不想在应用程序中到处传递上下文对象。 我希望将其隔离在模型层中。 我想在业务层中操作简单的 POSO (普通的旧Swift对象)。

为此,我需要一种将NSManagedObject对象转换为业务对象,反之亦然的方法。

另外,我的数据库对象不应该知道我的业务对象。 这样,我可以轻松地用另一个数据库提供程序替换Core Data,而不会影响其余的代码库。 这个想法的灵感来自清洁架构。

业务和模型层

在我们的应用程序中,请记住,我只有一个表来存储用户最后一次执行某项操作的时间。 很简单

我在业务层中创建了一个Event类。 这是我将在视图中操作的对象。

对于模型层,我创建了一个EventManagedObject类,该类继承自NSManagedObject

从一种模式到另一种

为了双向转换对象,我创建了一个由Event类实现的ObjectConvertible协议。

identifier用于获取相应的NSManagedObject (如果存在)。

然后,我创建了ManagedObjectConvertible协议。

因为我不想在实现该协议的每个NSManagedObject子类中重写相同的代码,所以我写了一个协议扩展来完成大部分工作。 这就是魔术发生的地方。

该协议由EventManagedObject类实现。

由于协议扩展,我只剩下两种方法可以实现。 这些是将业务对象的数据传输到数据库对象的数据,反之亦然的方法。

CRUD操作

现在,无需直接操作NSManagedObject对象,即可在Event对象上执行操作非常容易。

商店

在本文开头,我说过我不想在整个代码中都传递NSManagedObjectContext对象。

为了隔离上下文,我创建了一个EventStore类,该类在NSManagedObjectContext对象上保留了一个引用。

然后,可以在视图控制器或视图模型中使用商店。

业务层使用商店对业务对象执行操作。 它不知道对象的存储位置,它可能在Core Data,Realm甚至文件中。 这是我的抽象层。

缺点

尽管此方法在处理模型对象时提供了一定的便利,但它也有一些缺点。

最大的问题是我无法使用Core Data的内置延迟加载系统或NSFetchedResultsController 。 如果要使用它,则必须创建自己的分页系统。

此解决方案中也未实现处理关系 。 即使我没有进行调查,嵌套对象的转换也可能会在from(object: T)toObject() -> T实现方法中进行。

最后的想法

我设法完成了我最初想要做的事情, Event类完全与EventManagedObject无关

我正在操作视图中的简单对象

并且模型层与应用程序的其余部分隔离 。 我绝对可以用另一个数据库提供程序替换Core Data,而不会影响其余的代码库。

剩下的唯一事情就是处理核心数据错误 。 我一定会在应用程序中执行某些操作。

老实说,我从未开发过具有模型抽象层的应用程序。 就像我说的那样,至少从我的经验来看,这在iOS世界中并不常见。 但是我对结果非常满意,我一定会在“记住”中使用它。

欢迎任何反馈!