无限期加载媒体图片

时间:2016-07-23 17:20:59

标签: sdwebimage jsqmessagesviewcontroller

我目前正在使用JSQMessagesViewController来显示图像气泡,而SDImageWeb则用于下载图像并显示它。我这样做的方式是有人会向一个人发送包含网址的短信,发件人和收件人都会检查该内容以及是否匹配显示并从网址下载图片。它会显示为图像气泡而不是文本消息。

预期行为

发送媒体图像或接收时,我应该最终加载图像(图像上有加载动画)。加载后,我很容易看到它下次我没有加载,因为它被缓存。

实际行为

接收媒体图像时,有时会立即加载,但有时如果尝试加载它会无限期加载。我知道它已经完成下载,因为如果我通过消息传递或回到主视图并返回到相同的viewcontroller来触发重新加载集合视图,它将显示出来。如果我关闭我的应用程序并重新启动它,我已完成下载的图片应该显示,而不是无限期地显示为再次加载。它只发生在最近的那些,旧的都没关系。

重现的步骤

  • 使用SD图像下载媒体气泡图像
  • 可能在较慢的互联网上发送图像,加载时间超过几毫秒

我尝试修复

我这样做的方式是我会收到一条包含网址的邮件,然后我下载并返回一个包含媒体气泡的JSQMessage。我尝试在该索引处重新加载collectionview,或者在SD web中使用完成块重新加载整个collectionview,但最终会出现无限循环。

我不确定这是否是SDweb或JSQMessageController的错误。我曾尝试使用Kingfisher作为图像缓存和下载,结果相对相同。

代码

override func collectionView(collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! {
    let message = self.messages[indexPath.item]

    if (message.body!.rangeOfString ("An image https://x.com/uploads/") != nil) {

        let types: NSTextCheckingType = .Link

        let detector = try? NSDataDetector(types: types.rawValue)

        guard let detect = detector else {
            let JSQTypeMessage = JSQMessage(senderId: message.from, senderDisplayName: message.from, date: message.date, text: message.body)

            return JSQTypeMessage
        }

        let matches = detect.matchesInString(message.body!, options: .ReportCompletion, range: NSMakeRange(0, message.body!.characters.count))

        var stringUrl:NSURL?

        stringUrl = matches[0].URL!

        let tempImageView = UIImageView(image: nil)
        tempImageView.sd_setImageWithURL(stringUrl, completed: nil)

        let photoImage = JSQPhotoMediaItem(image: tempImageView.image)

        // This makes it so the bubble can be incoming rather than just all outgoing.
        if !(message.from == self.senderId) {
            photoImage.appliesMediaViewMaskAsOutgoing = false
        }

        let message = JSQMessage(senderId: message.from, displayName: self.senderDisplayName, media: photoImage)
        return message
    }

    let JSQTypeMessage = JSQMessage(senderId: message.from, senderDisplayName: message.from, date: message.date, text: message.body)

    return JSQTypeMessage
}

1 个答案:

答案 0 :(得分:0)

我认为你要做的是使用内置于sdWebImage的完成处理程序

tempImageView.sd_setImageWithURL(stringUrl, completed: {
//Set your image in here because you know that you have an image
// Then reload the cell
Self.tableView.reloadCellAtIndexPath(indexPath)


})
相关问题