0

バックエンドレス データベースから迅速にデータを受信しようとしています。コードは致命的なエラーをスローします: 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
}

「players」にはデータが含まれているため、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