使用 Swift 测试 CloudKit 中是否存在记录 2

Test for presence or absence of a record in CloudKit with Swift 2

我正在编写一个 tvOS 应用程序。我想测试一下 CloudKit 数据库中是否有记录。

我试图通过查看是否有包含特定 eventID 的记录来做到这一点。

理想情况下,我想调用一个 returns true 或 false 的函数:

if isEventInWatchListFile(eventID) {
 // ... do things
}

我试过的是:

 var results = [AnyObject]()
 var onList:Bool?

 . . .

    func isEventInWatchListFile(eventID: String) -> Bool {

        let container = CKContainer(identifier: "the container")
        let privateDB = container.privateCloudDatabase

        let predicate = NSPredicate(format: "eventID == %@",eventID)
        let query = CKQuery(recordType: "UserWatchlist", predicate: predicate)

        privateDB.performQuery(query, inZoneWithID: nil) { results , error in
            guard let results = results else {
                // error handler to come
                return
            }

            if results[0]["eventID"] != nil {

              self.onList = true

            } else {

              self.onList = false
            }
        }

        return self.onList!
    }

这与 "fatal error: unexpectedly found nil while unwrapping an Optional value" 一起崩溃。我认为这是因为 onList 被锁定在一个闭包中。我有两个问题:

1) 是否可以将 onList 传递给 return 语句,如果可以,如何传递?我已经阅读了 Swift 中关于闭包的内容,但不确定如何应用我所阅读的内容。

2) 有没有更好的方法来做我想做的测试?我的方法对我来说似乎很笨拙。

我对 iOS 和 Swift 很陌生。收到任何帮助。

如果我正确阅读你的代码,你的陈述

return self.onList!

将始终失败,因为您正在异步设置值,并且在异步操作结束之前将默认 (nil) 值传递给 return。

您可以创建类似 func doSomethingEventInWatchListFile(eventID: String, funcToRunIfEventIsInTheWatchList: () -> Void) 的内容,而不是 func isEventInWatchListFile(eventID: String) -> Bool。那么你将拥有:

        if results[0]["eventID"] != nil {

          funcToRunIfEventIsInTheWatchList()

        } else ...