だから、私は、アプリ(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クエリが非同期に返されるため、親ループに戻ってきているとは思われません)...まだ実装されていない、私はタオルを投げようとしている原因 - 良い方法がある必要があります!私はここに戦略を欠けていることを願っています
...
は私には思えるあなたが必要支持者から原因へのバックリンク、ない?その場合、USERSとSUPPORTERSリストにあるCAUSのリンクテーブルをお勧めします。次に、それはちょうど2つのクエリです - すべての私のフォローを取得し、各USERがSUPPORTERである原因を取得し、重複原因を除外します。 – tbondwilkinson
ええ、それは意味がある...私はオプションとしてそれを探検する。 –
私はこのフレームワークに精通していませんが、セマンティクスを変更することなく、構文を少しシンプルにすることができます。私は通常 '' let x = y {x {...}の中では 'for y in y ?? [] {... '。私は 'if error == nil ...'を 'guard error!= nil else {return}'に置き換えることも考えています。これらの2つはあなたの行を節約しませんが、列を節約します:これはあなたの最も内側の '// do stuff 'を9段階のインデントから6まで減らします。 –