Я видел похожие вопросы, но ответы не помогли мне. Код не красивый, но здесь идет. Я реализовал MessageKit, и мои изображения не отображаются при загрузке предыдущих сообщений или при отправке изображения. Изображения отображаются в виде пустых пузырьков чата, как показано на рисунке.
- Пустые изображения - я напечатал URL-адреса, поэтому я знаю, что значения поступают из база данных. У меня есть функция loadMessages, которая извлекает данные из MySQL. Почему-то он не передает информацию об изображении в messageKit, хотя тексты проходят нормально. Вот код:
Файл Message.swift
private struct ImageMediaItem: MediaItem {
var url: URL?
var image: UIImage?
var placeholderImage: UIImage
var size: CGSize
init(image: UIImage) {
self.image = image
self.size = CGSize(width: 240, height: 240)
self.placeholderImage = UIImage()
}
}
internal struct Message: MessageType {
var messageId: String
var sender: SenderType {
return user
}
var sentDate: Date
var kind: MessageKind
var user: User
private init(kind: MessageKind, user: User, messageId: String, date: Date) {
self.kind = kind
self.user = user
self.messageId = messageId
self.sentDate = date
}
init(custom: Any?, user: User, messageId: String, date: Date) {
self.init(kind: .custom(custom), user: user, messageId: messageId, date: date)
}
init(text: String, user: User, messageId: String, date: Date) {
self.init(kind: .text(text), user: user, messageId: messageId, date: date)
}
init(attributedText: NSAttributedString, user: User, messageId: String, date: Date) {
self.init(kind: .attributedText(attributedText), user: user, messageId: messageId, date: date)
}
init(image: UIImage, user: User, messageId: String, date: Date) {
let mediaItem = ImageMediaItem(image: image)
self.init(kind: .photo(mediaItem), user: user, messageId: messageId, date: date)
}
init(thumbnail: UIImage, user: User, messageId: String, date: Date) {
let mediaItem = ImageMediaItem(image: thumbnail)
self.init(kind: .video(mediaItem), user: user, messageId: messageId, date: date)
}
}
Функция loadMessages в файле DirectMessage.swift
func loadMessages(offset: Int, limit: Int) {
let url = URL(string: "https://localhost/message.php")
let body = "username=\(me)&uuid=\(uuid)&recipient_id=\(meid)&limit=\(limit)&offset=\(offset)"
var request = URLRequest(url: url!)
request.httpMethod = "POST"
request.httpBody = body.data(using: String.Encoding.utf8)
URLSession.shared.dataTask(with: request) { (data, response, error) in
DispatchQueue.main.async {
if error != nil {
Helper().showAlert(title: "Server Error", message: error!.localizedDescription, in: self)
return
}
do {
guard let data = data else {
Helper().showAlert(title: "Data Error", message: error!.localizedDescription, in: self)
self.isLoading = false
return
}
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary
guard let parseJSON = json else {
print("Error while parsing")
return
}
guard let posts = parseJSON["messages"] as? [NSDictionary] else {
self.isLoading = false
print("Error while parseJSONing")
return
}
self.hhmessages = posts as [AnyObject?] as [AnyObject]
for i in 0 ..< self.hhmessages.count {
let meid = self.hhmessages[i]["sender_id"]! as! String
let sender = User(senderId: self.hhmessages[i]["sender_id"]! as! String, displayName: (self.hhmessages[i]["sender"])! as! String)
AppSettings.senderId = self.hhmessages[i]["sender_id"] as? String
AppSettings.displayName = self.hhmessages[i]["sender"] as? String
let member = self.hhmessages[i]["recipient"]
let text = self.hhmessages[i]["messagetext"] as? String
let uuid = self.hhmessages[i]["uuid"] as! String
let sid = self.hhmessages[i]["sender_id"]
let message_id = self.hhmessages[i]["notesid"] as? String
let path = self.hhmessages[i]["uploadpath"] as! String
let sentDate = self.hhmessages[i]["date"] as! String
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
if let date = dateFormatter.date(from: sentDate) {
}
if path.isEmpty {
let message = Message(text: text!, user: sender, messageId: uuid, date: self.date)
self.messages.append(message)
}
else {
let pictureURL = URL(string: path)!
print(pictureURL)
URLSession(configuration: .default).dataTask(with: pictureURL) { (data, response, error) in
if let image = UIImage(data: data!) {
DispatchQueue.main.async {
let message = Message(image: image, user: sender, messageId: uuid, date: self.date)
self.messages.append(message)
}
}
}
}
self.messageList = self.messages
self.messagesCollectionView.reloadData()
DispatchQueue.main.async {
self.messagesCollectionView.scrollToItem(at: IndexPath(row: 0, section: self.messages.count - 1), at: .top, animated: false)
}
}
return
} catch {
Helper().showAlert(title: "JSON Error", message: error.localizedDescription, in: self)
self.isLoading = false
return
}
}
}.resume()
}
MessagesDisplayDelegate
func configureMediaMessageImageView(_ imageView: UIImageView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) {
}
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
}
}
}
}
}
}