Изображения не отображаются в чате - MessageKit - PullRequest
1 голос
/ 12 марта 2020

Я видел похожие вопросы, но ответы не помогли мне. Код не красивый, но здесь идет. Я реализовал MessageKit, и мои изображения не отображаются при загрузке предыдущих сообщений или при отправке изображения. Изображения отображаются в виде пустых пузырьков чата, как показано на рисунке. enter image description here

  1. Пустые изображения - я напечатал 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
               }
           }
       }
    }
  }
}
...