Ios 下载图像的速度非常慢

Ios 下载图像的速度非常慢,ios,swift,Ios,Swift,我正在尝试创建我的第一个小聊天应用程序。用户可以在注册时更改其个人资料图片。每次用户与其他用户聊天时,我都会尝试显示配置文件图片。一切正常,但问题是有些图片速度非常慢。这会导致一些消息显示得很快,而另一些消息显示得很慢 我的代码: override func viewDidLoad() { super.viewDidLoad() messagesTableView.delegate = self messagesTableView.dataSource = self

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

我的代码:

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
}
此图像正在快速下载和显示: ->

这个下载和显示速度非常慢: ->


我已经找了几个小时想找到一个解决办法,但还没有找到。我希望有人能帮助我!谢谢,第二张图片太重了。这就是为什么它需要时间。当用户第一次上传图像时,您应该将图像尺寸裁剪到100x100或200x200。因此,数据库中的所有配置文件图片都将具有相同的尺寸,并且所需时间更少

即使您的小图像也是720x720=37kb,而另一个是3000x2002=11.2MB。所以你知道发生了什么


如果你不想在用户上传图片时裁剪图片,你必须在你的服务器上这样做,服务器会保留每个图片的缩略图。所以接下来会发生的是,原始图片将存储在数据库中,但您将获取小尺寸的缩略图。但这取决于你想要实现什么

第二张图像太重。这就是为什么它需要时间。当用户第一次上传图像时,您应该将图像尺寸裁剪到100x100或200x200。因此,数据库中的所有配置文件图片都将具有相同的尺寸,并且所需时间更少

即使您的小图像也是720x720=37kb,而另一个是3000x2002=11.2MB。所以你知道发生了什么


如果你不想在用户上传图片时裁剪图片,你必须在你的服务器上这样做,服务器会保留每个图片的缩略图。所以接下来会发生的是,原始图片将存储在数据库中,但您将获取小尺寸的缩略图。但这取决于你想要实现什么

看看你的代码,你正在使用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
}

看看你的代码,你正在使用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
}

慢速图像是一个11.2MB的图像(而另一个图像只有几KB)。。。这将永远是缓慢的。你应该尝试优化(在大小方面)可以上传的内容。慢速图像是一个11.2MB的图像(而其他图像只有几KB)。。。这将永远是缓慢的。您应该尝试优化(在大小方面)可以上传的内容。谢谢您的帮助!谢谢你的帮助!谢谢你的帮助!谢谢你的帮助!