2017-11-11 13 views
1
override func viewDidLoad() { 
super.viewDidLoad() 
getImageUrl() 
} 


func getImageUrl(){ 
ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value) { (snapchot) in 
    let postsss = snapchot.value as! [String : AnyObject] 
    for (_,posst) in postsss { 
     if let uid = posst["userID"] as? String{ 

      if uid == Auth.auth().currentUser?.uid{ 
       if let myPostURL = posst["pathToImage"] as? String{ 
       self.imageURLs.append(myPostURL) 

       } 

      } 
     } 
    } 
} 
} 

私のコードでFirebaseのすべての記事を閲覧し、自分のuserIDがcurrentusersのuidと一致するかどうかをチェックします。一致していると自分の画像です。 pathToImageのURLをimageURLs()[""]というコード内の配列に送ります。しかし、私はそれをどうするかわかりません。私は、SDWebImageを使用して自分の画像をcollectionViewセルに表示しています。私はそれをテストしたうえで、imageURLs ["URL here"]という配列にランダムなURLをコピーして貼り付けるとうまくいきます。firebaseから自分の投稿を取得し、それをコレクションビューのセルに表示しますか? ios

私はSwiftとFirebaseの新機能です。 :)

ここで私のファイアベースファイルのイメージです。 https://ibb.co/bXLMcb

Psst! posts/pathToImageには、取得したいURLが格納されています。

ユーザー/ urlToImageはプロフィール写真です。私は今実際にはそれを必要としません

+0

ようこそ。あなたが抱えている問題がどこにあるのかを説明してください。エラーメッセージが表示されますか? –

+0

ちょっと勘違いですが、少なくとも、userIDとpathToImageの "posst"キーは、firebaseデータベースで使用したものと一致せず、問題を引き起こします。 –

+0

一般的に、変数に同じ単語を付けるのは悪い習慣です異なる綴りでこれはおそらくあなたが見ている予期しない動作と関係しています。 –

答えて

0

その後、あなたは巣ソートのこのようなあなたのfirebaseクエリを、することができます。

ノードを反復処理すると、100万のノードがある場合、それが起こるのを待っている間に長い時間がかかり、UIが繋がります。

最終行は次のとおりです。あなたが探しているもの(この場合uid)を知っているなら、クエリは非常に簡単な解決法です。

let postsRef = self.ref.child("posts") 
let query = postsRef.queryOrdered(byChild: "userID").queryEqual(toValue: "uid_0") 
query.observeSingleEvent(of: .value) { (snapshot) in 
    if snapshot.exists() { 
     for child in snapshot.children { //.value can return more than 1 match 
      let snap = child as! DataSnapshot 
      let dict = snap.value as! [String: Any] 
      let myPostURL = dict["urlToImage"] as! String 
      self.imageURLs.append(myPostURL) 
     } 

    } else { 
     print("no user posts found") 
    } 
} 

上記のコードでは、まず投稿ノードへの参照を作成します。次に、このユーザー(uid_0)の投稿のみを返すクエリ。

次に、投稿のスナップショットを繰り返して、配列に追加します。

これは、データベース内のすべてのノードのロードと評価がはるかに効率的です。

詳細については、Sorting And Filteringのデータを参照してください。

+0

これはかなりエレガントなソリューションです!これにより、firebaseへのインデックス付けや二重呼び出しを回避します。 –

0

データベースのどこかにあなたのすべてのユーザーの投稿のインデックスを格納することを考えてください。あなたは毎回すべての投稿を観察する必要はありません。これを非正規化といいます。 Firebaseには、あなたのデータベースの整理に関する記事が書かれています。

Here's some information regarding firebase filtering in swift

最も良い解決策は、ユーザーによって編成された「投稿ID」のリストを持つ別個のノードを追加することです。その後、そのノードを観察し、返されたIDによって各投稿のみをダウンロードすることができます。 Here's a link about flattening data structures in firebase。それはこのようなものに見えるでしょう。

"posts":{ 
    "somePostID":{ 
     "timestamp": "0200231023", 
     "postContent": "here's my post content", 
     "authorUID" : "0239480238402934" 
    } ... 
}, 
"postsByGivenUID":{ 
    "someAuthorID":{ 
     "somePostID": "true", 
     "somePostID": "true", 
    }, 
    "someOtherAuthorID":{ 
     "somePostID": "true", 
     "somePostID": "true", 
     "somePostID": "true" 
    } 
} 

これは実際にコードをどのように構造化するかよりもはるかに大きな問題です。スケーラビリティのためには、ファイアベース全体のデータ構造を再評価する必要があります。クエリが使用されているノード内の特定のデータを検索するには

ref.child("postByGivenUID").child("Auth.auth().currentUser?.uid").observe(.childAdded) { (snapshot) in 
    ref.child("posts").child(snapshot.value).observeSingleEventOfType(of: .value) { (snap) in 
     // your actual post data will be here 
     // that way you won't be downloadin ALL posts EVERY time 

    } 
} 
+0

この答えが当てはまるかどうかは不明です。あなたの質問は何ですか?そして注文はなぜ重要ですか? uidを含む投稿を検索するだけでは意味がありませんか?この回答はかなり近いですが、コードをちょっと修正する必要があります。 – Jay

+0

私は先に進み、答えを編集しました。私はクエリの順序を取り除き、非正規化についての段落を追加しました –

+0

より近く。 OPが実際にやっていることを考えてみてください。ユーザーIDからユーザーのすべての投稿を照会します。 100万人のユーザーがいるとします。答えに現在のコードが含まれていれば、関心のあるノードを100万個見つけようとしています。uid =このユーザーのすべてのノードあなた?そうすれば、あなたが望む10点が返されます。 – Jay

関連する問題