如何解决在消息气泡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 举报,一经查实,本站将立刻删除。