ユーザのストレージに保存されている画像を取得し、カスタム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;
}
}
}
ありがとうございます。
私は自分のコードにそれを含めていません。私はすでにプレイヤーイメージを初期化しています。問題は、ビューが表示されたときにテーブルがロードされ、イメージがロードされるのを待たないということです。しかし、もう一度、私が望むのは、配列にイメージが含まれているかどうかをチェックし、そうでなければ、アセットに保存されている通常のイメージを提示することです。 cellForRowでif playerImages!= nilを使用することはできません。 – Petravd1994
私は自分の答えを編集しました。 let文を使うだけでnilをチェックできます。それが無ければ、if文の中に入りません。あなたの配列が初期化され空であれば、numberofrowsinSectionは0を返し、cellforrowat IndexPathはエラーを返しません。 –