2016-07-06 68 views
0

我有一個桌面視圖,我想填充firebase數據,也是我存儲在存儲中的圖像。用Firebase數據庫和存儲填充tableview?

我最初的遊戲計劃是運行一個觀察者到firebase,併爲快照中的每個項目填充一個firebase數據數組,並從存儲中以相同的捕捉名稱提取數據,並將它放在另一個數組中,然後在我的單元格中,我會用圖像數組的indexpath.row和數據數組中的數據填充圖像,它會匹配起來並變得很酷。

這次崩潰和燒燬是因爲從存儲下載圖像我想花費的時間比拉動信息長?和圖像數組被填充比數據慢,所以我得到一個崩潰,圖像[indexPath.row]超出範圍。

從數據庫和存儲中填充tableview的正確方法是什麼?

編輯:

我的火力點的數據是這樣的:

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)) 

我從數據庫中的陣列和從存儲到另一個陣列將圖像添加數據,然後當我使細胞我只設置數據,以將圖像數據[indexPath.row]和圖像[indexPath.row]。當我做images.count和data.count,並且我有兩件事情時,我的圖片落後3,所以這就是我得到的圖像[indexPath.row]超出範圍錯誤我猜。

+0

確實沒有一個正確的方法;有幾條路要走。這很大程度上取決於您的Firebase結構中的數據和圖像。你可以將它作爲文本包含在你的問題中嗎? – Jay

+0

@Jay Yep它現在在那裏。我不知道我是不是這樣做的基礎。我只會一次向用戶顯示最多10張照片,所以我想我可能不需要處理緩存?任何指導表示讚賞,謝謝你。 – Noowoo

回答

1

我通常會異步加載圖像,我有一個委託方法,在下載完成時觸發,並在下載新數據/圖像時刷新tableview。

製作一個佔位符圖像,也許使用旋轉加載器圖標將很好顯示在圖像下載之前。

編輯:

你需要調用self.tableview.reload()在pictureRef.dataWithMaxSize方法。 由於下載是異步的,因此當方法REF_USERS.child完成時,您的tableview將會重新加載,而不一定是在下載圖像時。 因此,要麼將self.tableview.reloadData放置在您的else clare中的pictureRef.dataWithMaxSize中,要麼在同一個位置創建委託方法來處理完成的下載圖像。

+0

感謝您的編輯。如果我無法弄清楚,但是你的編輯做了這個訣竅,會不會想到這件事,然後回來評論。非常感謝,感謝。 – Noowoo

+0

只是最後一個簡短的問題。隨着我的代碼設置atm的方式,每次一個新的職位,我猜圖片正在redownloaded,所以整個表格必須重新填充,所以它是非常緩慢和笨重的看,而只是一個新的職位自己添加。 這是緩存進來嗎? (之前從未做過),或者我可以調用一個初始的.Value觀察者,然後用戶.childAdded?你將如何解決? – Noowoo

+0

每次下載圖像時填充整個tableview都不太好。當你有一組數據來填充tableview調用.reload。當您需要添加項目(例如下載的異步圖像)或其他需要稍後添加的項目時,最好在行中插入項目,而不是反覆填充表格視圖。但是你應該總是把你的項目/數據添加到tableview數組中,因爲系統可以自己刷新tableview。 – Starlord

1

我覺得你可以做到這一點的最佳方式是顯示佔位符圖像,或者是從數據庫調用每個圖像的加載圖標。隨着圖像進入,您相應地更新tableView。

另一種可以做到這一點的方式是異步運行請求,並且只要所有進程完成,就可以將所有圖像一起顯示。

你甚至可以在顯示tableView之前顯示加載屏幕並加載圖像。

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

+0

感謝您的幫助,我可能會最終使用每個人的答案混合和匹配。欣賞幫助 – Noowoo