簡體   English   中英

用Firebase數據庫和存儲填充tableview?

[英]Filling a tableview with firebase database and storage?

我有一個表格視圖,我想填充Firebase數據以及要存儲在存儲中的圖像。

我最初的游戲計划是運行一個觀察者到Firebase,然后為快照中的每個項目填充一個Firebase數據數組,並使用相同的快照名稱從存儲中提取數據,然后將其放入另一個將匹配的數組中,然后放入單元格,我將圖像數組的indexpath.row以及數據數組中的數據填充到圖像中,它將匹配並變得很酷。

崩潰並燒毀了,因為我想從存儲下載圖像比提取信息花費的時間更長? 並且images數組的填充速度比數據填充的速度慢,因此導致image [indexPath.row]超出范圍時發生崩潰。

用數據庫和存儲中的數據填充表視圖的正確方法是什么?

編輯:

我的Firebase數據如下所示:

users
  02938409283049829304
    Category
        Cats : true
        Dogs:  true

這就是我想要做的:

REF_USERS.child(currentUserUID).child("Category").observeEventType(.Value) { ( snapshot: FIRDataSnapshot) in

        self.categoriesArray = []
        self.imagesArray = []

        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
            for snap in snapshots {


                self.categoryArray.append(snap.key)


                let pictureRef = DataService.ds.REF_BASE_STORAGE.child(self.currentUserUID).child(String(snap.key))

                pictureRef.dataWithMaxSize(9809898999098098 /* no idea what to put here*/) { (data, error) -> Void in
                    if (error != nil) {
                        print(error)  

                    } else {
                         let picture : UIImage! = UIImage(data: data!)

                       self.imagesArray.append(picture)

                        print(self.imagesArray.count)

                    }
                }


self.tableView.reloadData()

所以我想要這樣讀:

轉到用戶並在其類別下查看。 我想發布它的名稱,所以我只使用密鑰。 密鑰名稱與保存到存儲中的圖像完全相同,因此我使用該密鑰名稱從存儲中獲取照片。

 let pictureRef = DataService.ds.REF_BASE_STORAGE.child(self.currentUserUID).child(String(snap.key))

我將來自數據庫的數據添加到一個數組,將來自存儲的圖像添加到另一個數組,然后在創建單元格時,我只是將數據設置為data [indexPath.row],將圖像設置為images [indexPath.row]。 當我執行images.count和data.count兩者時,我都有3件事,我的圖像落后了3個滯后,所以我猜這就是我獲得images [indexPath.row]超出范圍錯誤的地方。

我覺得最好的方法是顯示占位符圖像,或為從數據庫中調用的每個圖像加載圖標。 隨着圖像進入,您將相應地更新tableView。

執行此操作的另一種方法是異步運行請求,一旦所有進程完成,就將所有圖像一起顯示。

您甚至可以顯示一個加載屏幕,並在顯示tableView之前先加載圖像。

您所要做的就是確保在將圖像添加到tableView之前存在這些圖像,並確保內存使用不會過度。

我通常以異步方式加載圖像,並且我有一個委托方法,該方法在下載完成時將觸發,並在下載新數據/圖像時刷新表格視圖。

在下載圖像之前,顯示占位符圖像並可能帶有旋轉的加載程序圖標非常適合顯示。

編輯:

您需要在pictureRef.dataWithMaxSize方法中調用self.tableview.reload()。 由於下載是異步的,因此當REF_USERS.child方法完成時(而不是在下載映像時),表視圖現在將重新加載。 因此,可以將self.tableview.reloadData放置在pictureRef.dataWithMaxSize的其他子句中,或者在同一位置創建一個委托方法來處理完成的下載圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM