ヒロポメと申します。
次世代チャットアプリを作っています!助けてください!( ;∀;)
現在Firebaseからコンテンツ情報(誰から、誰に、Firebase Storage内にあるメッセージ内容のurl、送信時間など)を取得して、配列に入れて、collection viewに表示させています。
ですが、メッセージの順番がバラバラになってしまいます。
4/21に送信したもの→4/26に送信したもの→4/18に送信したもの。といった具合です。
これは、そもそもFirebase Storage内で時間順になっていないからです。
そこで、こちらで並べ替える必要があると思っていますが、
Sort方法を色々調べたのですが全然うまくいかず、、、
お力貸していただけると助かります。
お手数ですが、アドバイス頂けますと幸いです。
よろしくお願いいたします。
**以下独自カスタムクラスです。
**
Swift
1 2class Message { 3 4 private var _senderId = ""; 5 private var _url = ""; 6 private var _timeStamp: NSNumber = 1 7 private var _toId = ""; 8 9 //クラスを初期化 10 init(senderId: String, url: String, toId: String, timeStamp: NSNumber) { 11 _senderId = senderId; 12 _url = url; 13 _toId = toId 14 _timeStamp = timeStamp 15 } 16 17 var senderId: String? { 18 get { 19 return _senderId; 20 } 21 } 22 23 var url: String? { 24 return _url; 25 //上のgetterの省略版 26 } 27 28 var toId: String? { 29 return _toId; 30 //上のgetterの省略版 31 } 32 33 var timeStamp: NSNumber? { 34 return _timeStamp; 35 //上のgetterの省略版 36 } 37 38}
次が、Firebase Databaseから必要な情報を取得して、配列に入れるところです。
Swift
1var messages = [Message]() 2 3//viewDidLoad内 4DBProvider.Instance.mediaMessagesRef.observe(.value, with: { (snapshot) in 5 6 if let dictionary2 = snapshot.value as? [String:AnyObject]{ 7 8 for d in dictionary2.values { 9 10 if let url = d["url"] as? String { 11 12 let senderId = d["sender_id"] as? String 13 14 let toId = d["toID"] as? String 15 16 let timeStamp = d["timeStamp"] as? NSNumber 17 18 let newContact = Message(senderId: senderId!, url: url, toId: toId!, timeStamp: timeStamp!); 19 20 //自分が送ったメッセージかつ、送り先が前画面(友達一覧リスト)で選んだ友達のとき。 21 if senderId == (Auth.auth().currentUser?.uid)! && toId! == self.toID { 22 23 self.messages.append(newContact); 24 } 25 //友達が送ったメッセージかつ、送り先が自分 26 else if senderId == self.toID && toId == Auth.auth().currentUser?.uid { 27 28 self.messages.append(newContact); 29 } 30 //自分からそれ以外に送ったメッセージや、友達が自分以外に送ったメッセージはスルーする。 31 32
ここまでで、collection view上に必要なコンテンツを表示させることには成功しています。
最後に、試してみたソートのコードを書きます。どれを実行しても順番は変わりませんでした。
Swift
1//パターン1 2 self.messages.sorted(by: {Double($0.timeStamp!) > Double($1.timeStamp!)}) 3//Double型に変換しているのは、そうしないと、次のエラーが出るかです。Binary operator '>' cannot be applied to two 'NSNumber' operands。 4//また、sort基準のtimeStampをsenderIdなどに変えても、順番は変わらないです。 5 6//パターン2 7 self.messages.sorted(by: { (first: Message, second: Message) -> Bool in 8 Double(first.timeStamp!) < Double(second.timeStamp!) 9 }) 10 11//パターン3 12 self.messages.sorted { (initial, next) -> Bool in 13 return Int(initial.timeStamp!) < Int(next.timeStamp!) 14 }
以下参考にさせていただいたリンクです。
→Swift how to sort array of custom objects by property value
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/02 05:11