我正在尝试从swift中的后端数据库接收数据。该代码抛出致命错误:在展开Optional值时意外发现nil。。
func findPlayersByPosition(position: String) -> [Player] {
let whereClause = "category = '\(position)'"
let dataQuery = BackendlessDataQuery()
dataQuery.whereClause = whereClause
var error: Fault?
let players = Backendless.sharedInstance().data.of(Player.ofClass()).find(dataQuery, fault: &error)
if error == nil {
print("Contacts have been found: \(players.data)") // **Fatal error is thrown on this line**
}
else {
print("Server reported an error: \(error)")
}
var playerDB = players.data as! [Player]
return playerDB
}
“玩家”确实包含数据,因此我认为可能会出现此错误,因为我在调用print(players.data)时使用同步方法来检索尚未完成的玩家。如果我错了,请纠正我。
所以我想使用异步方法来查看是否能解决错误。我一直在挖掘backendless documentation,它解释了如何进行异步调用:
func find(_ dataQuery: BackendlessDataQuery!, responder responder: IResponder!) -> Void
但我仍然不明白如何将此方法应用于我自己的代码?非常感谢。
更新问题
感谢目前为止的答案。我发现当我从viewdidload()内部调用函数时,它工作正常。但是,当我在viewcontroller中使用必需的init方法调用函数时,如下所示:
required init?(coder aDecoder: NSCoder) {
do {
let players = findPlayersByPosition("GK")
} catch let error {
fatalError("\(error)")
}
super.init(coder: aDecoder)
}
然后球员仍然是
Q1:为什么这不能在必需的init()中工作?
答案 0 :(得分:2)
你的玩家对象可能是零(或者player.data可能是零)。在if语句之前打印出来。
您可以按如下方式保护您的代码:
if let players = players {
if error == nil {
print("Contacts have been found: \(players.data)") // **Fatal error is thrown on this line**
}
else {
print("Server reported an error: \(error)")
}
}
else {
print("nil players object")
}
好像你应该异步调用Backendless:
let dataStore = Backendless.sharedInstance().data.of(Player.ofClass())
let players = dataStore.find(dataQuery,
response: { (result: BackendlessCollection!) -> Void in
// handle response here
},
error: { (fault: Fault!) -> Void in
// handle error here
})
https://backendless.com/documentation/data/ios/data_search_and_query.htm