在 SWIFT 的谓词中使用“timeIntervalSinceNow”
Posted
技术标签:
【中文标题】在 SWIFT 的谓词中使用“timeIntervalSinceNow”【英文标题】:Using "timeIntervalSinceNow" in a predicate in SWIFT 【发布时间】:2014-12-10 12:54:45 【问题描述】:我正在尝试使用 Cloudkit(在 SWIFT 中)查询过去 1 小时内创建的记录
我试过了:
let predicate = NSPredicate(predicateWithFormat : "timeIntervalSinceNow %@ < %f", "creationTime", -3600)
没有成功。错误消息是指解析错误。
有人知道正确的格式是什么吗?
n.b creationTime
是表中字段的名称
【问题讨论】:
您是尝试使用 Core Data 还是使用NSDate
实例的数组?
尝试在 CloudKit 数据上执行此操作。我认为它与 CoreData 具有相同的对象和语法
那么你不太可能让它工作,因为商店中的日期无法理解timeIntervalSinceNow
,你只需要使用
【参考方案1】:
您的谓词无效。看看Apple's guide for creating NSPredicates。
您应该在表达式的左侧使用key path。我假设你有一个对象数组,这些对象有一个名为creationTime
的属性。那么谓词应该是这样的:
NSPredicate(format: "creationTime.timeIntervalSinceNow > %d", -3600)
请注意,我在您发布的谓词中使用了“大于”>
运算符而不是 <
。这是因为过去的日期会从 timeIntervalSinceNow
方法返回一个负值,如 documentation 状态。
编辑: 似乎您不能在 CloudKit 谓词中使用关键路径。但我认为您可以创建一个参考日期(一小时前)并将其用于比较谓词:
let now = NSDate()
if let anHourAgo = NSCalendar.currentCalendar().dateByAddingUnit(
.HourCalendarUnit,
value: -1,
toDate: now,
options: NSCalendarOptions(0))
let predicate = NSPredicate(format: "creationDate > %@", anHourAgo)
let filtered = records.filteredArrayUsingPredicate(predicate!)
【讨论】:
感谢您的回答。我在 cloudKit 数据上执行此操作,我猜它的语法与您在 NSArray 上执行此操作的语法不同。不幸的是,Apple 的指南没有提供 Swift 的语法。 那么请编辑您的问题并添加有关使用 CloudKit 的信息。无论如何,CKQuery
类参考中提供了谓词语法:developer.apple.com/library/ios/documentation/CloudKit/…。 Swift 和 Objective-C 的谓词格式字符串语法应该完全相同。
我添加了另一种创建谓词的方法。它应该可以与 CloudKit 一起使用,但是我没有测试它,因为我不想为此设置一个完整的 CloudKit 项目。
谢谢。使其适用于您的格式 - 不过稍作调整。以上是关于在 SWIFT 的谓词中使用“timeIntervalSinceNow”的主要内容,如果未能解决你的问题,请参考以下文章