2016-06-30 8 views
2

Firebaseを使い始めましたが、これまでのところ私はそれが好きです。しかし、今私はトッピングしています - ストレージから画像をダウンロードしようとしています。しかし、私はバックグラウンドで画像をダウンロードしたくないので、直接ダウンロードしたいと思います。 Firebaseはストレージから直接画像をダウンロードします

for (NSInteger iLoop=0; iLoop<aFriendsKey.count; iLoop++) { 
      NSDictionary *dicFriend = [dicFriends objectForKey:[aFriendsKey objectAtIndex:iLoop]]; 
      FIRStorage *storage = [FIRStorage storage]; 
      FIRStorageReference *storageRef = [storage referenceForURL:[dicFriend objectForKey:@"avatarURL"]]; 
          // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) 
      [storageRef dataWithMaxSize:5 * 1024 * 1024 completion:^(NSData *data, NSError *error){ 
       if (error != nil) { 
        // Uh-oh, an error occurred! 
       } else { 
        [aFriendsAvatar addObject:data]; 
       } 
      }]; 
     } 
     [_tvFriends reloadData]; 
をし、それが正常に動作しますが、画像は私がのUITableViewをリロードするとき、彼らは利用できないことを意味し、時間内にダウンロードされません。

これまでのところ私がテストしています。前のコードから分かるように、NSMutableArray内のすべてのイメージをロードし、このNSMutableArrayを使用してイメージをUITableViewに表示しようとしています。

バックグラウンドダウンロードとreloadDataの間の遅延のため、決してイメージは表示されません。

アイデアや解決策はありますか?

答えて

1

画像を読み込んでいる間にメインスレッドをブロックすることはお勧めできません。そうしないと、アプリがユーザーに完全に反応しなくなります。代わりに、すべてのダウンロードが完了したときに通知を受け取ってから、テーブルビューを再ロードするだけです。これはGrand Central Dispatch(GCD)のdispatch_group_tで行うことができます。

dispatch_group_t group = dispatch_group_create(); 

for (NSInteger iLoop=0; iLoop<aFriendsKey.count; iLoop++) { 
    NSDictionary *dicFriend = [dicFriends objectForKey:[aFriendsKey objectAtIndex:iLoop]]; 
    FIRStorage *storage = [FIRStorage storage]; 
    FIRStorageReference *storageRef = [storage referenceForURL:[dicFriend objectForKey:@"avatarURL"]]; 
    // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) 
    dispatch_group_enter(group); 
    [storageRef dataWithMaxSize:5 * 1024 * 1024 completion:^(NSData *data, NSError *error){ 
     if (error != nil) { 
      // Uh-oh, an error occurred! 
     } else { 
      [aFriendsAvatar addObject:data] 
     } 
     dispatch_group_leave(group); 
    }]; 
} 

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 

    [_tvFriends reloadData]; 
}); 

ディスパッチグループは、未処理操作の簡単なカウンタと考えることができます。各ダウンロードを開始する前に、グループにdispatch_group_enterと呼び出して、カウントを増やします。各ダウンロードが完了すると、dispatch_group_leaveに電話してカウントを減らします。リスナーブロックをdispatch_group_notifyに登録すると、カウントが0になるとブロックが呼び出され、すべての操作が完了し、テーブルビューをリロードすることができます。また、この方法ではメインスレッドがブロックされず、ダウンロードが行われている間もユーザーはUIとやりとりできます。

+0

パトリック:素晴らしい。まさに私が探していたものでした。完璧に動作します! –

+0

@DietmarSchwarzWebersよろしくお願いします。このソリューションはあなたのために働いて以来、私の答えのチェックマークをクリックしてそれを受け入れられた答えとしてマークします。お役に立てて嬉しいです! –

関連する問題