Tag:

为模型创建一个抽象层

您是否在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 。 如果要使用它,则必须创建自己的分页系统。 此解决方案中也未实现处理关系 […]