Как загружать изображения динамически внутри UITextView - PullRequest
2 голосов
/ 05 января 2020

У меня есть UITextView и добавление TextAttachments внутри него. Я получаю фотографии с веб-адреса. Вот код:

image.load(url: URL(string: ("http://www.furkan.webofisin.com/upload/media/5db1b96366cd8.jpg")))
                        imageAttachment.image = image.image

                    let image1String = NSAttributedString(attachment: imageAttachment)
                    fullString.append(image1String)

И это функция загрузки в качестве расширения:

var imageUrlString: String?

func load(urlString: String) {

    imageUrlString = urlString
    guard let url = URL(string: urlString) else {

        DispatchQueue.main.async {
            let urlMessage = "Hata"
            appDelegate.errorView(message: urlMessage, color: smoothGreenColor)
        }

        return

    }

    image = nil

    if let imageFromCache = imageCache.object(forKey: urlString as NSString) {

        self.image = imageFromCache
        return
    }

    URLSession.shared.dataTask(with: url) { (data , response, error) in

        if error != nil {

               DispatchQueue.main.async {
                     let urlMessage = "Bir hata meydana geldi."
                     appDelegate.errorView(message: urlMessage, color: smoothGreenColor)
                     }
            return
        }

       DispatchQueue.main.async {

            let imageToCache = UIImage(data: data!)

            if self.imageUrlString == urlString {

                self.image = imageToCache
            }

             imageCache.setObject(imageToCache ?? UIImage(named: "astast")!, forKey: urlString as NSString)

       }

    }.resume()

}

Изображения, не отображаемые в первый раз после обновления sh, отображают страницу из-за кэширования. Я проверил image.image как UIImage, но его всегда ноль до окончания загрузки.

Вот скриншот первого открытия.

При первом открытии данные изображения равны nil

Как я могу обнаружить и перезагрузить изображения, когда данные изображения заполнены.

1 Ответ

0 голосов
/ 05 января 2020

Добавление завершения, так как вызов для получения изображения изначально асинхронный в отличие от локального кэша

func load(urlString: String,completion:@escaping(()  -> () )) {

    imageUrlString = urlString
    guard let url = URL(string: urlString) else {

        DispatchQueue.main.async {
            let urlMessage = "Hata"
            appDelegate.errorView(message: urlMessage, color: smoothGreenColor)
        }

        return

    }

    image = nil

    if let imageFromCache = imageCache.object(forKey: urlString as NSString) {

        self.image = imageFromCache
        completion()
        return
    }

    URLSession.shared.dataTask(with: url) { (data , response, error) in

        if error != nil {

               DispatchQueue.main.async {
                     let urlMessage = "Bir hata meydana geldi."
                     appDelegate.errorView(message: urlMessage, color: smoothGreenColor)
                     }
            return
        }

       DispatchQueue.main.async {

            let imageToCache = UIImage(data: data!)

            if self.imageUrlString == urlString {

                self.image = imageToCache
            }

             imageCache.setObject(imageToCache ?? UIImage(named: "astast")!, forKey: urlString as NSString)

            completion()
       }

    }.resume()

}

Вызов

image.load(url: URL(string: ("http://www.furkan.webofisin.com/upload/media/5db1b96366cd8.jpg"))) {

            imageAttachment.image = image.image 
            let image1String = NSAttributedString(attachment: imageAttachment)
             fullString.append(image1String)

}
...