2016-01-06 7 views
43

だから、私は、アプリ(iOSの、スウィフト)に「retweet'のような機能を実装Parseを使用する使命を帯びてきました。parse.com「リツイート」パターンがあまりにも冗長である

hereの前にこれが尋ねられましたが、それはかなり高レベルです。b)私は手近な仕事を得ています。私は明らかに建築意思決定の助けを求めていませんが、何か、私はフィードバックを受け入れることをうれしく思います。

私のアプリにはそれぞれUSERによって作成されたCAUSESがあります。 TOおよびFROMユーザーを持つFOLLOW表もあります。 開始するには、私が単に投稿したユーザーがTOユーザー(ここでは現在のユーザーはFROMユーザー)のobjectIdとFOLLOWテーブル内で一致するように、CAUSESテーブルを照会します。より簡潔に:

let getFollowedUsersQuery = PFQuery(className: Constants.kParseClassFollowers) 
getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!) 

let causesQuery = PFQuery(className: Constants.kParseClassCauses) 
causesQuery.whereKey(Constants.kParseFieldFromUser, matchesKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery) 
causesQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
    if let causes = objects { 
     for cause in causes { 
      // populate the tableview cells, etc. 
     } 
    } 
}) 

今私は、私が従うすべての原因をユーザーから持っています...それはすべてかなり標準的です。

ここでそれは難しいです。
各CAUSEにはSUPPORTERSという名前の関係もあります。 私は私が従わない人からすべての原因を得る方法を設計する必要がありますが、私が従うユーザーは支持者のリストにあります。

私は「ブルートフォース」1に近づいていますけれども、私は、エレガントな解決策を見つけるためには至っていない、そしてそれはとても面倒ですし、私のプログラマの脳のより良い半分はscreaming at me like Susan Powterであることを冗長に...

ここですサンプルは:

let retweetQuery = PFQuery(className: Constants.kParseClassCauses) 
retweetQuery.orderByDescending(Constants.kParseFieldCreatedAt) 
retweetQuery.whereKey(Constants.kParseFieldFromUser, notEqualTo: PFUser.currentUser()!) 
retweetQuery.whereKey(Constants.kParseFieldFromUser, doesNotMatchKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery) 
retweetQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
    if let causes = objects { 
     for cause in causes { 
      let supporterRelations = cause.relationForKey(Constants.kParseClassSupporters) 
      let supporterQuery = supporterRelations.query() 
      supporterQuery.findObjectsInBackgroundWithBlock { (supporters, error) in 
       if(error == nil && supporters?.count > 0) { 
        for supporter in supporters! { 
         let user:PFUser = supporter as! PFUser 
         getFollowedUsersQuery.whereKey(Constants.kParseFieldToUser, equalTo: user) 
         getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!) 
         getFollowedUsersQuery.findObjectsInBackgroundWithBlock({ (results, error) -> Void in 
          if(error == nil && results?.count > 0) { 
           for result in results! { 
            // do stuff 
           } 
          } 
         }) 
        } 
       } 
      } 
     } 
    } 
}) 

さて、これは純粋な狂気、そして信じられないほど無駄である(特に解析が無料ティアの計算方法を考える - 私は生産にプッシュた場合、これは本当に私のAPIの制限に大きく貢献できると感じ)。

は、すでに2つのクエリをやったので、私はそれに従うかどうかを確認するためにその関係で上の各ユーザーを別のクエリを実行、その後、サポーターの関係上、各原因のために別のクエリを行い、その後、完全に1をやり直し...その情報を取得したら、そのユーザーのサポートされている原因をループする必要があります(Parseクエリが非同期に返されるため、親ループに戻ってきているとは思われません)...まだ実装されていない、私はタオルを投げようとしている原因 - 良い方法がある必要があります!私はここに戦略を欠けていることを願っています

...

+4

は私には思えるあなたが必要支持者から原因へのバックリンク、ない?その場合、USERSとSUPPORTERSリストにあるCAUSのリンクテーブルをお勧めします。次に、それはちょうど2つのクエリです - すべての私のフォローを取得し、各USERがSUPPORTERである原因を取得し、重複原因を除外します。 – tbondwilkinson

+1

ええ、それは意味がある...私はオプションとしてそれを探検する。 –

+2

私はこのフレームワークに精通していませんが、セマンティクスを変更することなく、構文を少しシンプルにすることができます。私は通常 '' let x = y {x {...}の中では 'for y in y ?? [] {... '。私は 'if error == nil ...'を 'guard error!= nil else {return}'に置き換えることも考えています。これらの2つはあなたの行を節約しませんが、列を節約します:これはあなたの最も内側の '// do stuff 'を9段階のインデントから6まで減らします。 –

答えて

1

jesses.co.tt @私は、これは遅すぎる少なすぎる場合、私は間違いなく私はこれを答えるいますのでご注意取るごめんなさいそれが尋ねられてから数ヶ月後に、私はこれが一般的に答える価値があると思います(そしておそらくあなたにとって価値があるかもしれません)。

一般的に、100%は、Parseを使ったその3つのクエリがa)大量に効率が悪く(古いシステムで)、b)それを念頭において、間違ったアプローチのように思われるParseが現在シャットダウンして以来、この時点で使用できる唯一のメカニズムは文脈上のものですが、疑問が尋ねられたときには関係なく...と考えていました)。これらの変更を一般的なスキーマ/アーキテクチャーに適用できると仮定すると、これをかなりクリーンな方法で修正できる2つのソリューションがあります。

1) 第1の解決策は、各UserUserをテーブル自体に有する再図式データセットに本質的に「外部キー」サポーターのサブセットです。この方法では、Cause - >Supporter - >Userに行くのではなく、理論的にはCause - >User(ここからは、そこから列になるのでデフォルトでサポーターを得ることができます)。私の記憶が正しければParseでこれを行うには、あなたはそれが価値だと特定の型の配列を持っている列を設定し、実際のSupporterテーブルがあるのobjectリンク(パースダッシュボードにうまく表示)することができテーブルのUserテーブルにこのテーブルへのリンク列を保持します。あなたは手動で私は書き込み自分はそれが自動化されるべきで、それを行うためのコード意味で(手動で行う必要があるでしょうが、それはないので

ている間は、write側のビットより多くの仕事です開発の面では無料で起こる)。この少し先行write操作を使用すると、その後、2ステップreadの代わりに、第二の溶液は、クエリの速度であれば、この種のデータのために別のプロバイダを使用することです。3.

2)を持っています問題。私のプロジェクトのいくつかでは、私は、データクエリの検索この種のソケットベースのアプローチを使用し、PusherまたはFirebase「すべての包括性」、Firebaseがはるか解析のようなもののからであることの(非常に異なるレベルの両方のように考えていますGoogle今回は、Pusherが少し基本的で「DIY」です)。

Firebase

、例えば、このデータセット+ Causeテーブル自体はUser sが彼らに属し(そしてここでUserが自分Supporter秒のキャッシュを持っているもののキャッシュを持っているスキーマへのソケット)、この3ステップのルックアップは、2つのパラメータで1つのクエリになることができます(理想的なシナリオだと思います)。私は、これもParseで実現できると信じていますが、提案された最初のソリューションにスキーマのリファクタリングの別のステップが必要です。

私はコメントに、これに類似した何かが(上記の解決策の両方で)推奨されているが、はるかに精巧ではない形式であると思います。私はこれが元の質問者または誰かに役立つことを願っています。誰かが推奨されるように、これはまた、理論的には、前述1件のコメントとしてPubNubを使用することができますが、それは同じように簡単にこのDBは、AWS上でホストされているPostgreSQLのにスキーマまたはHerokuを構築できるとせずに解析とまったく同じメカニズムを達成しますオーバーヘッドこれは今だけのオープンソースの自己ホスト型ソリューションとして提供されて解析するための基準であるため、

はまた、ここでは自分のAWS上で解析をホストに移行するためのガイドです:link here

+0

偉大な答えは、すぐに再訪されます!ありがとう! –

関連する問題