Recientemente, he estado desarrollando una aplicación de chat y tenía problemas para cargar imágenes de forma asíncrona con el chat.
Trabajando con MessageKit - 2.0
había probado esto
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() }}
Luego inicializo el Image MessageType con kind = .photo(Image(url: url))
Esto no parece funcionar.
Desde entonces, supe que MessageKit proporciona un método de delegado en MessagesDisplayDelegate llamado
func configureMediaMessageImageView(_ imageView: UIImageView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView)Podemos cargar imágenes de forma asíncrona para un mensaje determinado con este método de delegado.
Estoy usando una extensión UIImageView para ayudar con esto
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 } } } } } }Entonces la solución es la siguiente
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) }