未从 Firebase 存储加载的用户图像
Posted
技术标签:
【中文标题】未从 Firebase 存储加载的用户图像【英文标题】:user images not loading from Firebase storage 【发布时间】:2017-06-15 13:15:20 【问题描述】:运行此代码时,我只从资产返回UIImage(named: "Home Button")
,而不是每个用户选择的图片?任何想法为什么??
class usersScreenVC: UITableViewController
let cellId = "cellId"
var users = [User]()
override func viewDidLoad()
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(handleCancel))
tableView.register(UserCell.self, forCellReuseIdentifier: cellId)
fetchUser()
func handleCancel()
self.dismiss(animated: true, completion: nil)
func fetchUser()
FIRDatabase.database().reference().child("Users").observe(.childAdded, with: (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject]
let user = User()
self.users.append(user)
user.DisplayName = dictionary["Display Name"] as? String
user.SubtitleStatus = dictionary["SubtitleStatus"] as? String
DispatchQueue.main.async
self.tableView.reloadData()
, withCancel: nil)
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return users.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellId)
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
let user = users[indexPath.row]
cell.textLabel?.text = user.DisplayName
cell.detailTextLabel?.text = user.SubtitleStatus
cell.imageView?.image = UIImage(named: "Home Button")
if let profileImageURL = user.profileImageURL
let url = URL(string: profileImageURL)
URLSession.shared.dataTask(with: url!, completionHandler: (data, response, error) in
//this mean download hit an error so lets return out.
if error != nil
print(error!)
return
DispatchQueue.main.async(execute:
cell.imageView?.image = UIImage(data: data!)
)
).resume()
return cell
class UserCell: UITableViewCell
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
//class
【问题讨论】:
【参考方案1】:我认为您的代码有两个问题可能会有所帮助。首先,从 Firebase 存储加载图像时使用 SD WebImage 被认为是最佳做法。 SD WebImage会处理异步加载图片,缓存图片,保证同一个URL不会被多次下载,虚假URL不会被重试。 SD WebImage 随 Firebase 一起提供,因此您需要做的就是确保已将 Storage 添加到 PodFile 并在 TableViewController 中为 SDWebImage 和 FirebaseStorage 创建导入。然后你应该把你的 cellForRowAt indexPath 修改成这样:
import SDWebImage
import FirebaseStorage
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellId)
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
let user = users[indexPath.row]
cell.textLabel?.text = user.DisplayName
cell.detailTextLabel?.text = user.SubtitleStatus
cell.imageView?.image = UIImage(named: "Home Button")
if let profileImageURL = user.profileImageURL
let url = URL(string: profileImageURL)
cell.imageView?.sd_cancelCurrentImageLoad()
cell.imageView?.sd_setImage(with: url, completed: (image, error, type, url) in
DispatchQueue.main.async
cell.layoutSubviews()
)
return cell
其次,您在哪里为每个用户设置个人资料图片?我可以看到您设置显示名称和字幕状态,但我看不到您在哪里添加个人资料图像。也许您打算执行以下操作:
if let dictionary = snapshot.value as? [String: AnyObject]
let user = User()
self.users.append(user)
user.DisplayName = dictionary["Display Name"] as? String
user.SubtitleStatus = dictionary["SubtitleStatus"] as? String
//did you forget to add the profile image url like this?
user.profileImageURL = dictionary["ProfileImage"] as? String
DispatchQueue.main.async
self.tableView.reloadData()
, withCancel: nil)
【讨论】:
以上是关于未从 Firebase 存储加载的用户图像的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:Fire Base 存储图像上传的后期初始化错误