2017-11-18 179 views
0

我一直在開發照片存儲應用程序,會從我的火力地堡數據庫中的圖像鏈接,將它們存儲在以一個數組,然後通過這個數組得到從圖像中運行相應的Firebase存儲使用陣列中的鏈接。中的CollectionView火力地堡存儲的getData負荷圖像無序

但是,即使代碼按順序通過鏈接運行,getData函數也會加載圖像。我不知道爲什麼發生這種情況,儘管我最初的想法是圖像按大小順序加載/加載時間最短。這是我的代碼。

for link in Constants.officialLinksArray { 
     let storage = Storage.storage().reference(forURL: link) 

     // Download the data, assuming a max size of 1MB (you can change this as necessary) 
     storage.getData(maxSize: 10 * 1024 * 1024) { (data, error) -> Void in 
     // Create a UIImage, add it to the array 
     if let error = error { 
      print(error) 
     } else { 
      //print(self.imageCount) 
      let loadedImage = UIImage(data: data!) 
      self.photoArray.append(loadedImage!) 
      Constants.officialPhotoArray = self.photoArray 
      self.buttonArray.append(self.photoArray.count) 
      self.collectionView.reloadData() 
      //print(self.photoArray) 

     } 

    } 
} 

任何幫助表示讚賞。謝謝!

+1

而不是在這裏下載圖像在cellforrow與異步和它的更多信息請參閱此:https://stackoverflow.com/questions/24231680/loading-downloading-image-from-url-on-swift –

回答

0

關於爲什麼你的負載沒有考慮到你的陣列順序,我認爲(但你需要檢查)getData方法是異步

含義,當你通過你的鏈接循環數組你告訴執行GetData方法與給定的鏈接,但你的循環不會等到你的圖像的第一負載做是爲了進入下一個環節。

爲了說明我的目的,使打印您的else語句(在您的負載完成),而另一個打印內部閉包之外,但你在圈裏面到底。我想你會看到一些有關你的代碼執行的有趣行爲。

最後,如果是的getData異步的,基本上你的第一印象是第一加載,而不是在你的陣列順序的第一個。首先由於網絡的規模,網絡質量,數據庫的可用性等原因而加載。這就是爲什麼你讓你的圖像混亂。

+0

我明白了。這就是我懷疑發生的事情。在獲取下一張圖像之前是否有任何方法可以等待第一張圖像加載? –

+0

你可以使用一個完成塊,這裏是一個例子:https://stackoverflow.com/questions/43388608/how-to-make-synchronous-operation-with-asynchronous-callback – Arrabidas92