在message bubble MessageKit swift中显示来自远程服务器的图像

在message bubble MessageKit swift中显示来自远程服务器的图像,swift,nsurlsessiondownloadtask,messagekit,Swift,Nsurlsessiondownloadtask,Messagekit,我试着在信息包的信息气泡中显示图像。据我所知,MessageKit有很多类型的气泡。对于我的方法.photo(ImageMediaItem),我认为是最好的消息类型。我想在新创建的消息集合视图中看到加载的图像,或者这是个坏主意?我不知道如何解决这个问题,所以这是我自己的想法。我找到的图像加载教程。为此,我创建了用于存储图像的结构: private struct ImageMediaItem: MediaItem { var url: URL? var image: UI

我试着在信息包的信息气泡中显示图像。据我所知,MessageKit有很多类型的气泡。对于我的方法
.photo(ImageMediaItem)
,我认为是最好的消息类型。我想在新创建的消息集合视图中看到加载的图像,或者这是个坏主意?我不知道如何解决这个问题,所以这是我自己的想法。我找到的图像加载教程。为此,我创建了用于存储图像的结构:

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()
    }
    
}
由于我从远程服务器接收到消息数据,所以我决定循环接收到的消息数据,并在图像位于数据中时向远程服务器发送请求。以下是服务器响应的处理:

chatMd.chat?.unread?.forEach({ (message) in
var mKind:MessageKind = .text(message.body!)
DispatchQueue.main.async {
      if  message.body!.extractURLs().count > 0{
           let link = message.body!.extractURLs()[0]
           if link.absoluteString.contains("jpg") || link.absoluteString.contains("png") || link.absoluteString.contains("jpeg"){            
               mKind = .photo(ImageMediaItem(image: imageFromServerURL(urlString: link)))
            }else{
               mKind = .linkPreview(MockLinkItem(text: "nil", attributedText: nil, url: URL.init(string:  link.absoluteString)!, title: link.lastPathComponent, teaser: "", thumbnailImage: #imageLiteral(resourceName: "attachment")))
             }
         }
      }
                                        


})
}
对于链接获取,我使用了这样的扩展,也许它会很有用:

extension String {
    func extractURLs() -> [URL] {
        var urls : [URL] = []
        do {
            let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
            detector.enumerateMatches(in: self, options: [], range: NSMakeRange(0, self.count), using: { (result, _, _) in
                if let match = result, let url = match.url {
                    urls.append(url)
                }
            })
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        return urls
    }
}
因此,正如您所看到的,图像获取从这里开始:

mKind = .photo(ImageMediaItem(image: imageFromServerURL(urlString: link)))
对于我创建的图像获取函数:

func imageFromServerURL(urlString: URL) -> UIImage {
        var finalImg = UIImage()
        var request = URLRequest(url: urlString)
        
        request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
        request.setValue("Bearer " + UserDefaults.standard.string(forKey: "access_token")!, forHTTPHeaderField: "Authorization")
        
        
        URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
           
            if error != nil {
                print(error as Any)
                return
            }
            DispatchQueue.main.async(execute: { () -> Void in
                print(data?.count)
                finalImg = UIImage(data: data ?? Data()) ?? UIImage(systemName: "AppIcon")!
            })
            
        }).resume()
        
        
        return finalImg
    }
但我在这方面有个问题:

finalImg = UIImage(data: data ?? Data()) ?? UIImage(systemName: "AppIcon")!
我通常会收到这样的错误:

Fatal error: Unexpectedly found nil while unwrapping an Optional value
首先,我认为我有
nil
数据,但在检查了它的
.count
之后,我发现数据不是空的。所以我认为问题出在
UIImage
的某个地方,为了解决这个问题,我尝试添加这样的处理
??UIImage(系统名:“AppIcon”)但它并没有解决我的崩溃问题。也许有人会发现问题所在


另外,如果我没有发布一些重要信息,请在评论中告诉我,我会编辑我的问题。谢谢:)

请检查:@KishanBhatiya,但如何使用此方法?我在建议的方法中添加并更改了一些行,但是如何将其插入到消息工具包单元格中呢?因为现在当我想看到照片图像时,我看到了链接的文本表示