2016-07-20 10 views
0

Firebaseストレージを使用して4つのgifが保存されていて、Realtime Databaseを使用してダウンロードURLを取得し、アレイに追加しています。問題は、配列を反復処理してそれらをダウンロードしたいとき、それらが常に正しい順序でダウンロードされるとは限りません。実際には、毎回ランダムな順序でダウンロードされます。Firebaseが正しい順序でGIFをダウンロードしていない - iOS

これまでの私のコード:

if self.downloadURLS.isEmpty == true { 
    } else { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
      var newItems: [UIImage] = [UIImage]() 

      for (index, element) in self.downloadURLS.enumerate() { 
       print("Item \(index): \(element)") 
       self.storageRef = self.storage.referenceForURL(element) 
       self.storageRef.dataWithMaxSize(5 * 1024 * 1024) { (data, error) -> Void in 
        if (error != nil) { 
         // Uh-oh, an error occurred! 
        } else { 
         self.image = UIImage(gifData: data!, levelOfIntegrity: 1) 
         print("Downloaded \(index)") 
         newItems.append(self.image) 
        } 
       } 


       self.items = newItems 
      } 
     } 

     print(downloadURLS.joinWithSeparator("\n")) 
    } 

は、彼らがダウンロードすることを確認することのいずれかの方法がありますが、正しい順序であるか、私が最後に使用できる方法を並べ替えのいくつかの並べ替えはありますか?それが最後に完了した時間:2,3,0,1 ...どんな助けも素晴らしいだろう!

答えて

2

あなたのハンドラは非同期に呼ばれていると思います。私はあなたが事前にごnewItems配列を宣言し、すべての画像がダウンロードされたときに追跡するdispatch_group_tを追加することをお勧め:

また
var newItems = [UIImage?](count: downloadURLS.count, repeatedValue: nil) 
let group = dispatch_group_create() 

for (index, element) in self.downloadURLS.enumerate() { 
    dispatch_group_enter(group) 
    self.storageRef = self.storage.referenceForURL(element) 
    self.storageRef.dataWithMaxSize(5 * 1024 * 1024) { (data, error) -> Void in 
     if (error != nil) { 
      // element at this index stays nil 
     } else { 
      // Set the element at this index 
      newItems[index] = UIImage(gifData: data!, levelOfIntegrity: 1) 
     } 
     dispatch_group_leave(group) 
    } 
} 

// The following gets called asynchronously when every image has been downloaded (or failed to) 
dispatch_group_notify(group, dispatch_get_main_queue()) { 
    // This will throw an error because newItems is now an array of Optional UIImages 
    // It contains nil when there was an error while getting a specific item 
    self.items = newItems 
} 

:それはあなたがforループ内self.storageRefを割り当てることを正しいですか?代わりにローカル変数を使用する必要があります:

let ref = self.storage.referenceForURL(element) 
ref.dataWithMaxSize ... 
+0

ありがとうございました!これは完全に機能します。もちろん、dataWithMaxSizeはあなたの言ったように非同期で実行されます。もう一度、あなたに十分に感謝することはできません! – riverhawk

+1

@riverhawk私は助けることができてうれしいです;) –

関連する問題