ios - 将逻辑放入 CoreData 模型中

标签 ios swift core-data

我是 iOS 开发的新手,正在开发一种语言抽认卡应用程序,该应用程序会向用户展示一张抽认卡,然后用户可以说出他们是否记得它。如果他们点击"is",那么卡片将根据各种变量安排在未来的某个时间返回,如果他们点击“否”,那么卡片将很快返回。 (间隔重复系统)

我的问题是,当我使用 CoreData 作为应用程序的存储时,哪里是放置此调度逻辑的好地方?

我想到的两个地方是:

在抽认卡的 NSManagedObject 的子类中。

例如,我可以这样做:

Flashcard : NSManagedObject {
    ...
    @NSManaged var nextReview: NSDate?
    func reschedule() {
    // logic to assign a new date to nextReview
    }
    ...
}

然后在 Controller 中,它可以访问 CoreData(模型)和 View ,我可以简单地写:

// When the user has tapped a response:
flashcard.reschedule()

我可以看到这种方法的一个好处是,如果我必须在不同的 Controller 中分配新日期,我就不必重写调度逻辑。

或:

在 Controller 中计算新日期,然后更新模型。

FlashcardViewController {
    ...
    // When the user has tapped on a response:
    let newReviewDate = scheduler.calculateNextReviewDate(...)
    flashcard.nextReview = newReviewDate
}

重新调度的逻辑应该是 Controller 应该负责的事情,还是模型应该做的事情。或者 CoreData NSManagedObject 应该只是具有验证 getter 和 setter 的数据吗?有没有在 iOS 开发中首选的方法?

我想归根结底,我想知道 NSManagedObject 子类是否应该管理自己的逻辑。

作为一个附加但相关的问题,这类事情,决定以何种方式组织代码对我来说似乎是一个弱点。是否有任何好的资源可供我阅读以了解有关此类决策的更多信息,更重要的是,何时以及为何使用它们是好/坏的。

最佳答案

出于您提到的原因,我会将逻辑放入模型中。

但是,与其直接将它放在 NSManagedObject 的子类中,不如为它创建一个类别,例如FlashCard+Schedule.swift。这样,除了您所说的优点之外,如果您想重新生成模型,所有逻辑仍将存在于一个单独的文件中。

编辑:这是一个很好的 article在更高层次上涵盖这个主题(架构模式)。

关于ios - 将逻辑放入 CoreData 模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34236495/

相关文章:

iOS : subclassing UINavigationBar for custom title view

ios - Swift NSLocale 编程常量

ios - 如何在 AIR for iOS 应用程序中明确设置可用语言?

ios - 如何在iOS应用程序中正确使用NSCache?

ios - 在 Xcode 5 中使用 Mogenerator

ios - swift - NSPREDICATE 失败

iphone - 在 iOS 应用程序中显示服务器端内容 - 需要的方法

swift - 当 TapGestureRecognizer 连接到容器 View 时,未检测到触摸按钮

ios - 根据背景颜色调整图标颜色

iphone - 具有两个 NSFetchedResultsController 实例的 TableView