在 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)

请注意,我在您发布的谓词中使用了“大于”&gt; 运算符而不是 &lt;。这是因为过去的日期会从 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”的主要内容,如果未能解决你的问题,请参考以下文章

Swift coreData - 格式化日期并在谓词中使用它

Swift / Cloudkit 谓词格式

后台任务未在 Swift 中重新启动

swift CoreData 谓词

Swift 中 Realm 查询的交叉引用谓词

Swift 3 中的谓词和 SortDescriptor [重复]