swift
  • asynchronous
  • backendless
  • 2016-04-11 5 views 0 likes 
    0

    私は迅速にバックエンドレスデータベースからデータを受信しようとしています。コードはという致命的なエラーをスローします。オプション値をアンラッピングしている間に予期せずnilが見つかりました。Swift Asyncメソッドを使用してバックエンドレスDBからデータを取り出す方法は?

    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.data)を呼び出したときにまだ完了していない選手を取得するために、同期メソッドを使用していますので、このエラーが表示されるかもしれないと思います。私が間違っているなら、私を修正してください。

    私はそれがエラーを解決するかどうかを確認するために非同期メソッドを使いたいと思います。私は、非同期呼び出しを行う方法を説明していたbackendless documentationを掘りしてきた:

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

    しかし、私はまだ自分のコードにこの方法を適用する方法を理解していませんか?ヘルプは非常に感謝します。質問これまでに答えを

    おかげ更新

    。 viewdidload()の中から関数を呼び出すと、うまく動作することが分かりました。しかし、私はこのようなのViewControllerで必要なinitメソッドを使用して関数を呼び出すとき:必要なのinit(内からしないのはなぜこの作品):

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

    その後、選手たちはまだnill

    Q1のですか?

    +0

    は、あなたがブレークポイントでそれをデバッグしようとしたがありますか?コード内に存在する変数の内容は何ですか? – luk2302

    +0

    私の質問が更新されました。問題:私の関数はviewdidload()から呼び出すと機能しますが、viewcontroller内の必要なinitから呼び出すときは機能しません。どのようなアイデアはなぜですか? – Stijn

    +0

    同じロジックが適用されます。レイアウト情報はありません。それが純粋な運命であるviewDidLoadから動作するならば、それはすべてのデバイスで動作しません、initロジックまたはdidLoadではなく、それが属する場所にすべてのレイアウトロジックを配置します。 – luk2302

    答えて

    2

    プレイヤーオブジェクトはおそらくnil(またはplayers.dataはゼロかもしれません)です。 if文の前に出力してください。

    次のようにあなたのコードを保護することができます:あなたは非同期Backendlessを呼び出すべきであるように

    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") 
    } 
    

    は思え:

    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

    +0

    players.dataはwhereclauseのタイプミスのためにnillでした。これを修正しましたが、[player] の行「var playerDB = players.data as![Player]」にキャストしようとするとエラーが発生する問題を修正しました。 これを解決する方法はありますか? – Stijn

    +0

    私はplayers.dataのタイプがわからないので、私はあなたにいくつかの指針を与えることができます。任意の種類のオブジェクトの配列にデータを任意に変換することはできません。バックエンドレスは何をすると言いますか?あなたはそれらの文書や例を探しましたか? – ryantxr

    +0

    はい、ドキュメント自体の配列にキャストします。私は実際にviewdidload()内から作業する関数を持っていますが、viewcontroller内の必要なinit内から呼び出すとまだ動作しません(更新された質問を参照)。 – Stijn

    関連する問題