ios - 具有用于比较日期的瞬态属性的 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 中显示所有旅程
解决方案
您可以尝试以下 NSPredicate,它基于另一个问题,基本上将日期转换为 NSNumber,减去它们,然后将结果比较为大于或小于 3600 秒。
我没试过,但也许有帮助。最初的问题是在 ObjC 中,所以也许有些事情发生了变化。
NSPredicate(format: “departureDate != nil AND arrivalDate != nil AND CAST(departureDate, ‘NSNumber‘) - CAST(arrivalDate, ‘NSNumber‘) >= 3600“)
推荐阅读
- javascript - 尝试使用 javascript 为不和谐的机器人嵌入超链接
- azure-data-lake - 尝试在 Azure Synapse 中的链接存储上读取 parcquet 文件
- python - 如何告诉 ccxt 使用 binance / bybit 测试网
- python - 如何在 Python 中使用 pandas 读取文本文件并拆分数据框的每个字符/字母
- ios - 尝试关闭加载视图时应用程序崩溃
- ios - 为什么我的背景保持静态黑色?
- python - 在 pycharm 上加载经过训练的 Tensorflow 保存模型时出错。ValueError:int() 的无效文字,基数为 10:'class_name'
- python - 从python中的另一个函数调用main是否错误
- swiftui - SwiftUI 在移动/动画视图/形状上拖放
- javascript - 使用 react-select 时 XHR 错误加载 traceur.js