1

ユーザーが投票できる、Swiftで一種のホットまたはノットスタイルのアプリを構築しています:それぞれ、画像に対してHOT、NOT、MAYBEです。

ユーザーが画像に到達するたびに投票し、それぞれの投票ごとに IBAction がクエリをトリガーし、以下のコードに示すように、Parse からの合計投票数と合計ホット数の結果を表示します。

1,000枚の画像を予定しています。

それぞれの画像に対応するすべての objectID をプリロードして、ユーザーが画像に投票したときに、データが既にプリロードされているか、解析からクエリされているか? どうすればそれについて行くでしょうか?

今のところ、1000 の異なる画像から 1000 のクエリを取得する各 ObjectID のクエリを作成しています...明らかにスケーラブルではありません。

swipePosition 変数は、ユーザーがどの画像を表示しているかをカウントする単なるカウンターです。保存されている画像は、現在 Xcode に保存されている配列にあります。Parse に保存されている場合は、プリロードすることもできますか?

(「hotButtonQuery」関数のみを表示していますが、Not と Maybe の buttonQuery 関数もあります...)

スケーラブルになるようにこのコードを単純化する方法はありますか? 今のところ、25枚を超える画像を拡大縮小する方法はありません...

どうもありがとう!

func hotButtonQuery() {
    if swipePosition == 0 {
        var query = PFQuery(className:"UserData")
        query.getObjectInBackgroundWithId("RlvK3GhfqE") {
            (userData: PFObject!, error: NSError!) -> Void in
            if error != nil {

                println(error)
            }

            else {
            userData.incrementKey("totalVotes", byAmount: 1)
            userData.incrementKey("hot", byAmount: 1)

                var updateTotalVotesUILabel = userData.objectForKey("totalVotes") as NSInteger

                var updateHotsUILabel = userData.objectForKey("hot") as NSInteger

                userData.saveInBackground()

                println("parse was updated!")

                self.totalVotesLabel.text = String(updateTotalVotesUILabel)
                self.totalHotsLabel.text = String(updateHotsUILabel)
            }
        }
    } else if swipePosition == 1 {
            var query = PFQuery(className:"UserData")
            query.getObjectInBackgroundWithId("30WlVtgurP") {
                (userData: PFObject!, error: NSError!) -> Void in
                if error != nil {

                    println(error)
                }

                else {
                    userData.incrementKey("totalVotes", byAmount: 1)
                    userData.incrementKey("hot", byAmount: 1)


                    var updateTotalVotesUILabel = userData.objectForKey("totalVotes") as NSInteger

                    var updateHotsUILabel = userData.objectForKey("hot") as NSInteger

                    //println(userData.objectForKey("totalVotes"))
                    //println("total HOTs:")
                    //println(userData.objectForKey("hot"))

                    userData.saveInBackground()

                    println("parse was updated!")


                    self.totalVotesLabel.text = String(updateTotalVotesUILabel)
                    self.totalHotsLabel.text = String(updateHotsUILabel)


                }
            }
    } else if swipePosition == 3 {
        var query = PFQuery(className:"UserData")
        query.getObjectInBackgroundWithId("5D6ARjk3xS") {
            (userData: PFObject!, error: NSError!) -> Void in
            if error != nil {

                println(error)
            }

            else {
                userData.incrementKey("totalVotes", byAmount: 1)
                userData.incrementKey("hot", byAmount: 1)


                var updateTotalVotesUILabel = userData.objectForKey("totalVotes") as NSInteger

                var updateHotsUILabel = userData.objectForKey("hot") as NSInteger

                //println(userData.objectForKey("totalVotes"))
                //println("total HOTs:")
                //println(userData.objectForKey("hot"))

                userData.saveInBackground()

                println("parse was updated!")


                self.totalVotesLabel.text = String(updateTotalVotesUILabel)
                self.totalHotsLabel.text = String(updateHotsUILabel)


            }
        }
    }
4

1 に答える 1

0

敬意を表して、アプローチ全体を再考することをお勧めします。コードに objectId を保存しないでください。基本的に同じコード ブロックを何度も繰り返さないでください。複雑にしないでおく:

  1. 画像を取得して表示する
  2. 投票を取得してオブジェクトを保存
  3. 次のオブジェクトを照会してプロセスを繰り返す

クエリの数を減らしたい場合は、10 程度のバッチで取得します。ユーザーが 1000 件すべてをクリックする可能性は低いため、すべてをロードしても意味がありません。

把握しなければならない唯一のことは、ユーザーが既に投票した画像を追跡する方法です。これは、クライアント側または Parse 内で行うことができます。まともなアプローチがいくつかあります。

于 2015-02-27T20:44:42.523 に答える