如何使用Swift Async方法从后端数据库中检索数据?

时间:2016-04-11 20:55:29

标签: swift asynchronous backendless

我正在尝试从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()中工作?

1 个答案:

答案 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