在消息气泡MessageKit swift中显示来自远程服务器的图像

问题描述

我正在尝试在Message Kit的消息提示框内显示图像。据我了解,Message Kit的气泡种类很多。我认为对于我的方法.photo(ImageMediaItem)是最好的消息类型。我想在新创建的邮件收集视图中看到已加载的图像,还是一个坏主意?我不确定如何解决此任务,所以这是我自己的想法。我发现了here的图像加载教程。为此,我创建了用于存储图像的结构:

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(systemName: "AppIcon")!,但并没有解决我的崩溃问题。也许有人会看到问题出在哪里。

P.S。如果我没有发布一些重要信息,请在评论中让我知道,我将编辑我的问题。谢谢:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...