2017-11-18 3 views
0

私はFirebaseデータベースからイメージリンクを取得し、配列に順番に格納してから、その配列を実行してイメージを取得しますアレイ内のリンクを使用して対応するFirebaseストレージFirebase Storage getDataはcollectionViewでイメージの順序が間違って読み込まれます

しかし、コードがリンクを順番に実行しても、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

関連する問題