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

时间:2015-12-10 19:09:32

标签: swift cloudkit tvos

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

我试图通过查看是否存在具有特定eventID的记录来实现此目的。

理想情况下,我想调用一个返回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!
    }

这与"致命错误崩溃:在解开一个Optional值"时意外地发现了nil。我认为这是因为onList被锁定在一个闭包中。我有两个问题:

1)是否可以将onList传递给return声明,如果是,如何?我已经读过Swift中的闭包,但不知道如何应用我读过的内容。

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

我是iOS和Swift的新手。任何帮助都很受欢迎。

1 个答案:

答案 0 :(得分:1)

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

return self.onList!

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

而不是func isEventInWatchListFile(eventID: String) -> Bool您可以创建类似func doSomethingEventInWatchListFile(eventID: String, funcToRunIfEventIsInTheWatchList: () -> Void)的内容。然后你会:

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

          funcToRunIfEventIsInTheWatchList()

        } else ...