首页 > 解决方案 > 具有用于比较日期的瞬态属性的 FetchedResultsController

问题描述

我在 CoreData 中有一个 JOURNEY 实体。它具有到达日期和离开日期作为属性。

到达日期和离开日期都是 NSDate 类型?

我只想获取那些持续时间超过一个小时的旅程。

为此,我在 Journey+CoreDataClass 中创建了一个瞬态属性

public var isJourneyLongEnough: Bool{
    if let arrival = arrivalDate as Date?, let departure = departureDate as Date?{
        let duration = departure.timeIntervalSince(arrival)
        return duration >= 3600 ? true : false
    } else{
        return false
    }
}

当我尝试获取它时崩溃并出现错误:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:在实体中找不到“keypath isJourneyLongEnough”。

在研究有关此问题的更多信息时,我发现我们不能在谓词中使用瞬态属性,因为从persistentStore 获取托管对象时这些属性不存在。

您不能使用基于瞬态属性的谓词进行获取(尽管您可以使用瞬态属性自己在内存中进行过滤)。...总而言之,如果您直接执行 fetch,则通常不应将基于 Objective-C 的谓词或排序描述符添加到 fetch 请求中。相反,您应该将这些应用于获取的结果。

实现这一目标的最佳方法是什么?我正在使用 FetchedResultsController 在 UITableView 中显示所有旅程

标签: iosswiftcore-datansfetchedresultscontroller

解决方案


您可以尝试以下 NSPredicate,它基于另一个问题,基本上将日期转换为 NSNumber,减去它们,然后将结果比较为大于或小于 3600 秒。

我没试过,但也许有帮助。最初的问题是在 ObjC 中,所以也许有些事情发生了变化。

NSPredicate(format: “departureDate != nil AND arrivalDate != nil AND CAST(departureDate, ‘NSNumber‘) - CAST(arrivalDate, ‘NSNumber‘) >= 3600“)

推荐阅读