現在、選択されたタグを持っているユーザーのuidを取得し、その各々のuidの情報を取得しタグにマッチした数の多い順にソートを試みています。
まず、モデルを以下のように作りました。
Swift
1 import UIKit 2 import Firebase 3 4 struct Team { 5 6 var key: String 7 var teamName: String 8 var matches: Int 9 10 init(snapshot: DataSnapshot) { 11 12 self.key = snapshot.key 13 self.teamName = (snapshot.value as! NSDictionary)["teamName"] as? String 14 self.matches = (snapshot.value as! NSDictionary)["matches"] as? Int ?? 0 15 16 } 17 }
Firebaseはこのような形です。
Swift
1{ 2 "tags": { 3 "NewYork": { 4 uid1: 1 5 uid2: 1 6 }, 7 "baseball": { 8 uid1: 1 9 } 10 } 11}
一つ一つの選択されたタグからそのタグを持っているuidを取得しuid1のように同じuidがあればmatchesに1を加えるために以下のように実装しました。
Swift
1 2var teams = [Team?]() 3 4func filterTeams(filterTag: FilteredTags) { 5 6 var uidDic = [String:Int]() 7 var result = [Team?]() 8 9 let tag = filterTag.selectedTag.components(separatedBy: "/") // "NewYork" と "baseball" を返します。 10 11 tag.forEach { (key) in 12 13 ref.child("tags").child(key).observe(.value, with: { (snapshot) in 14 guard let dictionary = snapshot.value as? [String:Any] else { return } 15 16 for (uid,_) in dictionary { 17 18 print(uid) /* これらを返します。 19 HMTkdd8CrGQfpVepp7zd4fOD0wB2 20 vi7DjgvIxDNIhrNScYuUSfRwX2y1 21 vi7DjgvIxDNIhrNScYuUSfRwX2y1*/ 22 23 if let count = uidDic[uid] { 24 uidDic[uid] = count + 1 25 for var team in teams { 26 if team?.key == uid { 27 team?.matches += 1 28 } 29 } 30 } else { 31 uidDic[uid] = 1 32 ref.child("team").child(uid).observe(.value, with: { (snapshot) in 33 var team = Team(snapshot: snapshot) 34 team.matches = 1 35 result.append(team) 36 self.teams.append(contentsOf: result) 37 DispatchQueue.main.async { 38 self.tableView.reloadData() 39 } 40 }) 41 } 42 } 43 }, withCancel: nil) 44 } 45 }//func
しかし、matchesは全て1で同じTeamが返ってきます。
おそらくここがうまく機能していないと思うのですが、解決方法を教えていただければとてもありがたいです。
よろしくお願い申し上げます。
Swift
1if let count = uidDic[uid] { 2 uidDic[uid] = count + 1 3 for var team in teams { 4 if team?.key == uid { 5 team?.matches += 1 6 } 7 } 8 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/16 23:32