Firebase(Database + Storage)からいくつかの情報をダウンロードし、コレクションビューを作成しようとしています。しかし、私はストレージからダウンロードしたデータをソートすることができません!(Swift)Firebase Storageからダウンロードしたデータをどのようにソートするのですか?
私のデータベースの構造は、次のとおりです。すべての
{
"Cards": {
"id_0": {
"title": "0",
"timestamp": "-0000105",
"photoURL": "http:// ..."
},
"id_1": {
"title": "1",
"timestamp": "-0000102",
"photoURL": "http:// ..."
},
"id_2": {
"title": "2",
"timestamp": "-0000100",
"photoURL": "http:// ..."
},
(...) // Up to 15
}
}
まず、私はFirebaseデータベースからの情報のダウンロードを開始します。次に、これらのアイテムのそれぞれについて「photoURL」データを取得し、Firebase Storageからその写真をダウンロードします。
データを日付でソートするには、queryOrderedを "timestamp"で使用しています。それはうまく動作します:それはid_0、次にid_1、id_2などを受け取ります。
しかし、私はストレージから写真をダウンロードを開始するとき、私の「タイトル」の情報は、私がダウンロードした写真に対応していない:だから
、私はちょうどそれぞれたい写真がコレクションビュー内の正しい位置にポップアップ表示されます。
これを行う最善の方法を知っている人はいますか?ありがとうございました!
注:
は、ここに私のコードで私は補助変数「countCalls」と「secondaryCountCalls」を使用して、このアプローチが好きではありません。
import Foundation
import UIKit
import Firebase
import FirebaseStorage
import FirebaseDatabase
import FirebaseAuth
var currentCollectionViewData = [UIImage]()
struct item {
let photoURL : String!
let title : String!
let timestamp : Int!
}
var incomingCards = [item]()
class HomeView: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
// Authorization
let uid = FIRAuth.auth()?.currentUser?.uid
// Creating reference to database:
let databaseRef = FIRDatabase.database().reference()
// Getting current date:
let currentDate = getCurrentDate()
var countCalls = -1
var secondaryCountCalls = -1
databaseRef.child("CARDS").queryOrdered(byChild: "timestamp").observe(.childAdded, with: { snapshot in
var timestamp = (snapshot.value as? NSDictionary)?["timestamp"] as! Int
incomingCards.append(item(title: (snapshot.value as? NSDictionary)?[“title”] as! String,
photoURL: (snapshot.value as? NSDictionary)?["photoURL"] as! String,
timestamp : timestamp))
currentCollectionViewData.append(UIImage(named: "default_Photo")!)
self.collectionView!.reloadData()
countCalls = countCalls + 1
FIRStorage.storage().reference(forURL: incomingCards[countCalls].photoURL).data(withMaxSize: 1 * 1024 * 1024) {(data, error) -> Void in
if (error != nil) {
print(error)
} else {
secondaryCountCalls = secondaryCountCalls+1
currentCollectionViewData[secondaryCountCalls] = UIImage(data: data!)!
self.collectionView!.reloadData()
}
}
})
}
そしてCollectionViewに私の拡張子:
extension HomeView: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize{
return CGSize(width: self.collectionView.bounds.width, height: 189)
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return incomingCards.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell
cell.imageFromCollectionView?.image = currentCollectionViewData[indexPath.row]
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = collectionView.frame.width/3 - 1
return CGSize(width: width, height: width)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0.5
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0.5
}
}