0

PFQueryTableViewControllerを拡張するクラスがあります。このクラスのqueryForTable() の実装では、 を使用してクエリを作成するために追加するデータを取得しようとしていますfindObjectsInBackgroundWithBlock。問題は、findObjectsInBackgroundWithBlockが非同期であるため、 から取得したデータをどのように使用し、それを使用して以下findObjectsInBackgroundWithBlockをビルドし、 .queryreturn query

私のコードとエラーを以下に示します。

override func queryForTable() -> PFQuery {
    let query = PFUser.query()
    //let query = PFQuery(className: "Room")

    query?.whereKey("objectId", notEqualTo: PFUser.currentUser()!.objectId!)

    //Showing OnlineUsers only
    let onlineUsersQuery = PFQuery(className: "OnlineUsers")
    onlineUsersQuery.whereKey("user", equalTo: PFUser.currentUser()!)
    onlineUsersQuery.findObjectsInBackgroundWithBlock({ (results:[AnyObject]?, error:NSError?) -> Void in

        let usersOnlineNow = results as! [PFObject]
        for user in usersOnlineNow {

            self.mLog.printToLog("Select only users who are in the OnLineUsers column")
            query?.whereKey("objectId", equalTo: PFUser.currentUser()!.objectId!)
            //query?.whereKey("objectId", equalTo: "noone")

            if self.searchInProgress {
                query!.whereKey("username", containsString: self.searchString)
            }

            if self.objects!.count == 0 {
                //https://groups.google.com/forum/#!topic/parse-developers/7O9YCHNbuEo
                query!.cachePolicy = PFCachePolicy.CacheThenNetwork //kPFCachePolicyCacheThenNetwork
                //query.cachePolicy = kPFCachePolicyCacheThenNetwork
            }

            query!.orderByAscending("username")

            return query!

        }

    })

//        query!.orderByAscending("username")
//        
//        return query!
}

画像表示機能とエラー

4

3 に答える 3

0

私も同じ問題を抱えていました。ビューが読み込まれると、queryForTable が呼び出され、理想的には遅延なく pftable のクエリを返す必要があります。私のクエリでは、条件を手動で作成するために他のいくつかのクエリが必要でした。そこで、実際のクエリを構築するバックグラウンド スレッドをディスパッチし、正しい解析クラスを選択した pfquery をすぐに返すことにしましたが、行は選択しませんでした。

これにより、queryForTable が正常に完了し、メイン スレッドで実行されている遅い pfquery に関する警告なしで、テーブル インターフェイスがすぐにレンダリングされます。次に、バックグラウンド クエリが終了したら、保存されている pfquery 変数を更新し、テーブル データの再読み込みを呼び出します。

ロジックは次のとおりです。

  • ビューの読み込み時に、queryIsReady のブール値フラグを false に設定し、行のないクラスを返す pfquery 値を設定します。

  • queryForTable で、queryIsReady == false の場合、バックグラウンド スレッドをディスパッチして実際の pfquery を作成し、行を生成しないデフォルトの pfquery を返します。

  • バックグラウンド スレッドが完了したら、pfquery 変数を必要な新しい値に設定し、queryIsReady = true に設定します。

  • テーブル データのリロードを呼び出します。これにより、queryForTable が再度呼び出されます。

バックグラウンド スレッドが完了する前に他のアクションによって queryForTable が実行された場合、ブール型の queryIsReady は false になり、空の結果セットが使用されます。

于 2017-04-13T01:40:43.443 に答える