2017-11-18 172 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