MessageKit-如何在MessagesViewController的子类中异步加载图像?

Pau*_*ndo 1 ios swift messagekit

最近,我一直在开发聊天应用程序,但在通过聊天异步加载图像时遇到了麻烦。

使用MessageKit-2.0

我试过了

import MessageKit

class Image: MediaItem {
  var url: URL?

  var image: UIImage?

  var placeholderImage: UIImage

  var size: CGSize

  init(url: URL) {
    self.url = url
    self.size = CGSize(width: 240, height: 240)
    self.placeholderImage = UIImage()
    DispatchQueue.global().async {
        if let data = try? Data(contentsOf: url) {
            if let image = UIImage(data: data) {
                DispatchQueue.main.async {
                    self.image = image
                }
            }
        }
    }
}

init(image: UIImage) {
    self.image = image
    self.size = CGSize(width: 240, height: 240)
    self.placeholderImage = UIImage()
}
Run Code Online (Sandbox Code Playgroud)

}

然后我初始化图像MessageTypekind = .photo(Image(url: url))

这似乎不起作用。

Pau*_*ndo 5

因为我已经了解到,MessageKit在提供委托方法MessagesDisplayDelegate称为

func configureMediaMessageImageView(_ imageView: UIImageView,
                                    for message: MessageType,
                                    at indexPath: IndexPath,
                                    in messagesCollectionView: MessagesCollectionView)
Run Code Online (Sandbox Code Playgroud)

我们可以使用此委托方法异步加载给定消息的图像。

我正在使用UIImageView扩展程序来解决这个问题

import UIKit

extension UIImageView {
  func load(url: URL) {
    DispatchQueue.global().async { [weak self] in
        if let data = try? Data(contentsOf: url) {
            if let image = UIImage(data: data) {
                DispatchQueue.main.async {
                    self?.image = image
                }
            }
        }
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

所以解决方法如下

func configureMediaMessageImageView(_ imageView: UIImageView,
                                    for message: MessageType,
                                    at indexPath: IndexPath,
                                    in messagesCollectionView: MessagesCollectionView) {
    /*acquire url for the image in my case i had a 
    custom type Message which stored  the image url */
    guard
        let msg = message as? Message,
        let url = msg.downloadURL
    else { return }
    imageView.load(url: url)
}
Run Code Online (Sandbox Code Playgroud)