为模型创建一个抽象层
您是否在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世界中并不常见。 但是我对结果非常满意,我一定会在“记住”中使用它。
欢迎任何反馈!