swift - 有没有办法在 Core Data 中使用带有参数的计算属性?

标签 swift core-data database-design nsmanagedobject transient

这可能是一个奇怪的问题,因为我不完全理解 transient 和新的派生属性在 Core Data 中是如何工作的。 所以假设我有一个 RegularClass 实体,它存储随时间重复的任何类。例如,每三天或每周重复一个类。这是它在数据模型中的样子:

data model for RegularClass

(RegularClass 属于 Schedule 实体,后者又属于 Course 实体)

现在,如果我们的类(class)每三天重复一次,我们将数字 3 存储在 frequency 属性中,并将字符串 "days" 存储在 unit 属性,然后在 Swift 中将其转换为枚举。每个 RegularClass 所属的 Schedule 都有一个 startDate 属性。

为了检查某个类(class)是否在给定日期发生,我没有比计算 startDate 和给定日期之间指定 unit 的差异更好的方法了,然后对差值和频率取余,如果为 0,则表示该类可以出现的日期。

var differenceComponent: Calendar.Component {
    switch unitType {
    case .weeks:
        return .weekOfYear
    case .days:
        return .day
    }
}

func getDifferenceFromDateComponents(_ dateComponents: DateComponents) -> Int? {
    switch unitType {
    case .weeks:
        return dateComponents.weekOfYear
    case .days:
        return dateComponents.day
    }
}

func dateIsInActiveState(_ date: Date) -> Bool {
    if let startDate = schedule?.startDate {
        let comps = Calendar.current.dateComponents([differenceComponent], from: startDate, to: date)
        if let difference = getDifferenceFromDateComponents(comps) {
            let remainder = Int64(difference) % frequency // that is the key!
            return remainder == 0
        }
    }
    return false
}

func containsDate(_ date: Date) -> Bool {
    if dateIsInActiveState(date) {
        if unitType == .days {
            return true
        }

        let weekday = Calendar.current.component(.weekday, from: date)
        return (weekdays?.allObjects as? [Weekday])?.contains(where: { $0.number == weekday }) ?? false
    }

    return false
}

现在,问题是这段代码非常适合我已经从提取请求中获得的类(class)。但是有没有一种方法可以在 NSPredicate 中传递一个日期参数来在请求发生时计算这个?或者我是否必须获取所有类(class)然后手动过滤掉它们?

最佳答案

要解决此问题,您可以将数据存储为标量类型,然后在谓词中进行简单的算术运算。而不是日期,使用具有从零开始的天数的整数(或这些计算所需的任何最小时间单位)。将您的重复周期存储为天数。

然后您可以在谓词中使用计算 ((searchDate - startDate) mod repeatCycle) == 0 来查找匹配的类。

正如您所建议的,针对不同的搜索情况对数据进行非规范化可能是明智的。

关于swift - 有没有办法在 Core Data 中使用带有参数的计算属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58639917/

相关文章:

python - Swift 任务打开管道的文件描述符

ios - Swift 2 中的内存字符串压缩

iOS CRASH 问题 - SIGSEGV

php - 允许用户从我的数据库构建 View 并编辑这些字段

ios - 如何为 Siri 快捷方式的每个自定义意图使用不同的 View Controller ?

ios - 我如何转至与当前 Controller 共享同一根 Controller 的另一个 viewController?

iOS15 : NSPersistentCloudKitContainer: how to un-share objects?

ios - 如何观察 NSManagedObject 是否从 managedObjectContext 中移除

mysql - 巴士预订系统座位管理

mysql - 存储播放列表中视频的顺序