我是 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/