2017-02-21 8 views
0

ユーザのストレージに保存されている画像を取得し、カスタムUITableViewCellの名前の隣に配置したいとします。問題は今、画像がダウンロードされていないときにテーブルビューがロードされることです(私は思っていますか?)、画像配列がゼロであるためにアプリケーションがクラッシュする原因になります。では、テーブルビューをロードする正しい方法は何ですか?私は、ユーザーエクスペリエンスのために、画像がダウンロードされていなくてもtableviewcell画像を表示し、アシストに保存されているデフォルト画像を提示することが重要だと思います。私はUIImagesを使って画像をロードするデフォルトのアセットにリンクし、ダウンロードが完了したら画像をプロファイル画像に変更することを考えました。しかし、私は本当にそれを行う方法の手がかりがありません。これは私がイメージのダウンロードについては、これまでに得たものである:FirebaseからUITableViewCellに画像を追加する

let storage = FIRStorage.storage() 
     let storageRef = storage.reference(forURL: "link.appspot.com") 
     channelRef?.observeSingleEvent(of: .value, with: { (snapshot) in 
      if let snapDict = snapshot.value as? [String:AnyObject]{ 
       for each in snapDict{ 
        let UIDs = each.value["userID"] as? String 
        if let allUIDS = UIDs{ 
         let profilePicRef = storageRef.child((allUIDS)+"/profile_picture.png") 
         profilePicRef.data(withMaxSize: 1 * 500 * 500) { data, error in 
          if let error = error { 
          } 
          if (data != nil) 
          { 
           self.playerImages.append(UIImage (data: data!)!) 
          } 
         } 

        } 
let userNames = each.value["username"] as? String 
        if let users = userNames{ 
         self.players.append(users) 
        } 
       } 
     } 

     self.tableView.reloadData() 
    }) 

このcellForRow

cell.playersImage.image = playerImages[indexPath.row] as UIImage 

マイルールでは、デフォルトのルールから、それを変更していないされています

service firebase.storage { 
    match /b/omega-towers-f5beb.appspot.com/o { 
    match /{allPaths=**} { 
     allow read, write: if request.auth != null; 
    } 
    } 
} 

ありがとうございます。

答えて

0

イメージのダウンロードが完了したらtableView.reloadData()に電話する必要があります。重要なことの1つは、プレーヤーの画像をplayerImages: [UIImage]!の代わりにplayerImages = [UIImage]()と初期化することです。それが空であれば、あなたの配列がnilでないことを示しません。私はこれが役立つことを願っていますさらに質問がある場合はお知らせください。

UPDATE:

if let players = playerImages { 
    //code 
} 
+0

私は自分のコードにそれを含めていません。私はすでにプレイヤーイメージを初期化しています。問題は、ビューが表示されたときにテーブルがロードされ、イメージがロードされるのを待たないということです。しかし、もう一度、私が望むのは、配列にイメージが含まれているかどうかをチェックし、そうでなければ、アセットに保存されている通常のイメージを提示することです。 cellForRowでif playerImages!= nilを使用することはできません。 – Petravd1994

+0

私は自分の答えを編集しました。 let文を使うだけでnilをチェックできます。それが無ければ、if文の中に入りません。あなたの配列が初期化され空であれば、numberofrowsinSectionは0を返し、cellforrowat IndexPathはエラーを返しません。 –

0

ユーザーエクスペリエンスについて、あなたは正しいです。 URLからイメージをロードするときには、何らかのデフォルトイメージを持つことが標準的です。画像キャッシュに使用し、デフォルトアセットを使用する素晴らしいライブラリはAlamofireImage

です.Vandan Patelの回答は、テーブルビューを読み込むときに配列がゼロでないことを確認する必要があると言います。 AlamofireImageライブラリを使用して、画像で何かしたいと思う追加作業を処理するための補完ブロックが与えられます。

これは、Firebaseユーザーの正しいイメージURLを取得していることを前提としています。

+0

ご意見ありがとうございます。私はAlamofireImageについていくつかの良い機能を見ていますが、私は私の質問に答えることに心配しています。私のコードは正しくないと思うので、私のプロジェクトにAlamoを追加してもコードは修正されません。 – Petravd1994

+0

申し訳ありませんが、あなたの質問が正確に外挿するのは難しいです。ですから、もっと簡潔に説明できれば、おそらく私は助けることができます。元の質問は、読み込み中の画像の代わりにプレースホルダ画像を使用する方法だと思いました。 – jnewkirk

関連する問題