2017-04-08 28 views
1

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などを受け取ります。

しかし、私はストレージから写真をダウンロードを開始するとき、私の「タイトル」の情報は、私がダウンロードした写真に対応していない:だから

Example - How it is

Example - How I want it to be

、私はちょうどそれぞれたい写真がコレクションビュー内の正しい位置にポップアップ表示されます。

これを行う最善の方法を知っている人はいますか?ありがとうございました!

注:

は、ここに私のコードで私は補助変数「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 
    } 
} 

答えて

0

私は解決策を持って!答えはcellForItemAtとキャッシング!

まず、ただのviewDidLoad(から次のコードを削除):

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 
    incomingCards[secondaryCountCalls].photo = UIImage(data: data!)! 
    currentCollectionViewData[secondaryCountCalls] = UIImage(data: data!)! 
    self.collectionView!.reloadData() 
    } 
} 

今、私たちのファイル内に、次の拡張コードを作成してみましょう:

extension UIImageView { 

func loadImageUsingCacheWithUrlString(urlString: String) { 

    // check cachae for image first 
    if let cachedImage = imageCache.object(forKey: urlString as AnyObject) as? UIImage { 
     self.image = cachedImage 
     return 
    } 

    // otherwise fire off a new download 
    let url = NSURL(string: urlString) 

    URLSession.shared.dataTask(with: url! as URL, completionHandler: {(data, response, error) in 

     if error != nil { 
      print(error) 
      return 
     } 

     DispatchQueue.main.sync { 

      if let downloadedImage = UIImage(data: data!) { 

       imageCache.setObject(downloadedImage, forKey: urlString as AnyObject) 
       self.image = downloadedImage 

      } 
     } 
    }).resume() 
} 

そして最後に、cellForItemAt内次のコードを挿入します。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell 

    cell.imageFromCollectionView?.loadImageUsingCacheWithUrlString(urlString: incomingCards[indexPath.row].photoURL) 
    currentCollectionViewData[indexPath.row] = cell.imageFromCollectionView.image 

} 

YouTubeの(下のリンク)

Swift: Firebase 3 - How to Load Images from Firebase Storage and Caching (Ep 6)

から、 " はのは、そのアプリケーションを構築してみましょう" するクレジット
関連する問題