3

我见过类似的问题,但答案对我没有用。代码不是很漂亮,但这里有。我已经实现了 MessageKit,当加载以前的消息或发送图像时,我的图像没有显示。如图所示,图像显示为空聊天气泡。在此处输入图像描述

  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)
    }

}

DirectMessage.swift 文件中的 loadMessages 函数

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()

   }

消息显示委托

    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
               }
           }
       }
    }
  }
}
4

0 回答 0