0

我正在尝试快速从后端数据库接收数据。代码抛出一个致命错误:unwrapping an Optional value 时意外发现 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) 时尚未完成的玩家。如果我错了,请纠正我。

所以我想使用异步方法来查看是否可以解决错误。我一直在挖掘后端文档,其中解释了如何进行异步调用:

func find(_ dataQuery: BackendlessDataQuery!, responder responder: IResponder!) -> Void

但是我仍然不明白如何将此方法应用于我自己的代码?非常感谢帮助。

更新的问题

感谢您到目前为止的答案。我发现当我从 viewdidload() 内部调用该函数时,它工作正常。但是,当我在视图控制器中使用所需的 init 方法调用该函数时,如下所示:

required init?(coder aDecoder: NSCoder) {
    do {
        let players = findPlayersByPosition("GK")
    } catch let error {
        fatalError("\(error)")
    }
    super.init(coder: aDecoder)
}

然后玩家仍然是零

Q1:为什么这在所需的 init() 中不起作用?

4

1 回答 1

2

你的 player 对象可能是 nil(或者 player.data 可能是 nil)。在 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

于 2016-04-11T21:05:26.413 回答