我正在尝试创建我的第一个小聊天应用。用户可以在注册时更改其个人资料图片。每次用户与其他用户聊天时,我都会尝试显示个人资料图片。一切正常但问题是有些图片非常慢。这会导致某些消息显示速度很快而其他消息显示很慢。
我的代码:
override func viewDidLoad() {
super.viewDidLoad()
messagesTableView.delegate = self
messagesTableView.dataSource = self
messagesTableView.clearsContextBeforeDrawing = true
getMessages()
}
func getMessages() {
let ref = FIRDatabase.database().reference()
let messagesReference = ref.child("Messages")
// GETTING THE MESSAGES AND USERNAMES
messagesReference.observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let usernameReference = ref.child("Usernames").child(dictionary["Sender"] as! String)
// CONVERTING THE USERNAME INTO THE UID
usernameReference.observeSingleEvent(of: .value, with: { (snapshot2) in
if let dictionary2 = snapshot2.value as? [String: AnyObject] {
let uid = dictionary2["UID"] as! String
let uidReference = ref.child("Users").child(uid)
// GETTING THE PROFILE IMAGE LINK
uidReference.observeSingleEvent(of: .value, with: { (snapshot1) in
if let dictionary1 = snapshot1.value as? [String: AnyObject] {
let imageLink = dictionary1["Image Link"] as! String
// DOWNLOADING THE PROFILE IMAGE FROM THE LINK
let url = URL(string: imageLink)
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if(error != nil){
print(error as Any)
return
}
let profileImage = UIImage(data: data!)
DispatchQueue.main.async {
let message = Messages()
message.setValuesForKeys(dictionary)
message.profileImage = profileImage
self.messages.append(message)
self.messagesTableView.reloadData()
}
}.resume()
}
}, withCancel: nil)
}
}, withCancel: nil)
}
}, withCancel: nil)
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messages.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cellId")
DispatchQueue.main.async {
let message = self.messages[indexPath.row]
cell.textLabel?.text = message.Sender
cell.detailTextLabel?.text = message.Message
cell.imageView?.image = message.profileImage
}
return cell
}
此图片正在快速下载和显示: - > https://firebasestorage.googleapis.com/v0/b/chat-62eba.appspot.com/o/ProfileImages%2F766FB2E4-9153-4F99-81B2-14B2E3677459.png?alt=media&token=306e32e5-21b6-4ff5-918b-79c6173f0ae9
我已经搜索了几个小时才找到解决方案,但尚未找到解决方案。我希望有一个人可以帮助我!感谢
答案 0 :(得分:1)
第二张图片太重了。这就是为什么需要时间。当用户第一次上传图像尺寸时,您应该将图像尺寸裁剪为100x100或200x200。因此,数据库中的所有配置文件图片都具有相同的尺寸,并且所需的时间更少。
即使你的小图像是720x720 = 37kb而另一个是3000x2002 = 11.2 Mb。所以你看到发生了什么。
如果您不希望在用户上传时裁剪图片,则必须在服务器上执行此操作,以保留每张图片的缩略图。那么接下来会发生的是原始图片将存储在数据库中,但您将获取小尺寸的缩略图。但这取决于你想要达到的目标。
答案 1 :(得分:1)
查看您使用Firebase的代码,我猜您没有额外的后端。问题实际上是在上传方面。您需要来优化尺寸,从而裁剪图像。
func resize(image: UIImage, size: CGSize) -> UIImage? {
let scale = size.width / image.size.width
let height = image.size.height * scale
UIGraphicsBeginImageContext(CGSize(width: size.width, height: height))
image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}