我正在写一个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的新手。任何帮助都很受欢迎。
答案 0 :(得分:1)
如果我正确阅读了您的代码,您的陈述
return self.onList!
将始终失败,因为您正在异步设置该值,并且在异步操作结束之前将默认(nil)值传递给返回值。
而不是func isEventInWatchListFile(eventID: String) -> Bool
您可以创建类似func doSomethingEventInWatchListFile(eventID: String, funcToRunIfEventIsInTheWatchList: () -> Void)
的内容。然后你会:
if results[0]["eventID"] != nil {
funcToRunIfEventIsInTheWatchList()
} else ...