下载图片非常慢

时间:2016-11-19 15:13:17

标签: ios swift

我正在尝试创建我的第一个小聊天应用。用户可以在注册时更改其个人资料图片。每次用户与其他用户聊天时,我都会尝试显示个人资料图片。一切正常但问题是有些图片非常慢。这会导致某些消息显示速度很快而其他消息显示很慢。

我的代码:

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

这个下载并显示极慢: - > https://firebasestorage.googleapis.com/v0/b/chat-62eba.appspot.com/o/ProfileImages%2F0B758D09-58FE-4771-BA29-16FB0EAB2FFD.png?alt=media&token=8d886b45-dd14-4157-b647-217122b6d331

我已经搜索了几个小时才找到解决方案,但尚未找到解决方案。我希望有一个人可以帮助我!感谢

2 个答案:

答案 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
}
相关问题