我在哪里使用 Core Data 将业务逻辑放在 IOS 应用程序中?

Posted

技术标签:

【中文标题】我在哪里使用 Core Data 将业务逻辑放在 IOS 应用程序中?【英文标题】:Where do I put business logic in IOS app with Core Data? 【发布时间】:2016-01-22 17:16:03 【问题描述】:

我刚刚开始探索 ios 和 xcode,并开始构建使用 Core Data 的应用程序。

在我的模型中,我有 2 个相关实体:

具有examDate 和studyStartDate 的Exam 实体 用于计划/记录考试准备的 CalendarItem。

业务逻辑的一部分是:对于 studyStartDate 和examDate 之间的所有日期,我想要一个CalendarItem。

因此,为此,我需要在每次日期范围的开始和结束(在 studyStartDate 和examDate 中)更改时创建/删除 CalendarItems 的代码。

在其他帖子中(例如here)我读到这种类型的业务逻辑应该放在模型中(而不是在控制器中)。所以现在我需要在我的模型中找到一个可以编写代码的地方。

我的问题是:我在哪里创建此代码? 在考试项目的 NSManagedObject 的子类中?如何访问examItem 中的ManagedObjectContext(如果在我的模型中插入/删除其他记录,我认为我需要它)? 还是我需要继承 NSManagedObjectContext 并在那里构建我的逻辑?

我真的迷路了。

更新: 感谢下面的答案,我或多或少地跟进了数据库管理器模型。尝试保持 ManagedObjects 简单并专注于单个实体是正确的方向。

我创建了一个类 CalendarManager,我在 appdelegate 中实例化了一次。它接收 ManagedObjectContext。它订阅通知中心中的插入/删除通知,并为每个新考试设置键值观察器。

顺便说一句:KVO 只需要关注考试中的日期项目。不幸的是,无法使用 NSManagedObjectContextObjectsDidChangeNotification。这将陷入无限循环:添加/删除相关的 CalendarItem 也会更改 Exam,这将触发另一个循环。

CalendarManager.h

#import <CoreData/CoreData.h>

@interface CalendarManager : NSObject

-(id)initWith:(NSManagedObjectContext *)moc;

@end

CalendarManager.m

#import "CalendarManager.h"
#import "Exam.h" // NSManagedObject subclass
#import "CalendarItem.h" // NSManagedObject subclass

@interface CalendarManager ()

-(void)updateCalendarItemsFor:(Exam*)exam;
-(void)setObserverFor:(Exam*)exam;
-(void)removeObserverFor:(Exam*)exam;

@property NSArray *keyPaths;
@property NSManagedObjectContext *moc;

@end

这样对我有用。

【问题讨论】:

我在 NSManagedObject 的子类中这样做,我的意思是在数据库模型本身内部。 那么一个 NSManagedObject 可以创建其他 NSManagedObjects 吗?如何从 NSManagedObject 访问托管对象上下文?要获取/创建/删除兄弟对象,您需要 MOC,对吧? id myCtx = myObj.managedObjectContext @wintvelt 不完全是,每个 NSManagedObject 类都有自己的更新/删除/获取方法,一个 NSManagedObject 可以请求另一个 NSManagedObject 执行这些操作。 例如,Department 对象可以获取所有部门,但只有 Employee 对象可以获取特定部门的所有员工。我不确定这是否是正确的方法。 【参考方案1】:

我总是创建一个具有 NSManagedObjectContext 并插入/删除的 DatabaseManager。我的妈妈们只是愚蠢的班级,没有任何逻辑:P

但我想说这是一个见仁见智的问题

【讨论】:

您能解释一下它是如何工作的吗?您的 DatabaseManager 是什么样的类?您的 DBM 在哪里实例化? 我通常有一个从 NSObject 派生的单例类,它包含所有与核心数据相关的内容。它创建 cd 堆栈,我使用 sharedInstance 方法懒惰地实例化它

以上是关于我在哪里使用 Core Data 将业务逻辑放在 IOS 应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架时对将业务逻辑放在哪里感到困惑

Lumen 中的业务逻辑应该放在哪里?

将两个相关对象的业务逻辑放在哪里?

MVC 4 - 在哪里保留业务逻辑

使用redis作为我的核心BD时我的业务逻辑放在哪里

[EF Core]数据迁移