[英]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.