【问题标题】:SDWebImage error downloaded image has 0 pixelsSDWebImage 错误下载的图像有 0 像素
【发布时间】:2020-04-15 17:53:19
【问题描述】:

使用 SDWebImage 最新的 swift 库版本在加载几个 url 时出现以下错误

下载的图片有 0 像素

以下是代码

if let url = URL(string: storeImgStr.encoded), !(storeImgStr.isEmpty) {
        self.storeImg.sd_setImage(with: url, placeholderImage: UIImage(named: Constants.storeImagePlaceorderImage)) {
            (image, error, cahce, url) in
            if(error != nil) {
            }
        }

    }
    else {
        self.storeImg.image = UIImage(named: Constants.storeImagePlaceorderImage)

    }

我的网址看起来像这样由于政策问题域名已更改,无法分享确切的网址

https://tximages.mydomain.in/retailers_data_v2/retailer/320/3306-1-Aviator.jpg

以下是错误代码

Error Domain=NSURLErrorDomain Code=-1100 "(null)"

我还可以在网络浏览器中打开图片网址。

这到底是什么问题?

以下用于编码 url 的扩展

extension String {
var encoded: String {
    return self.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
}
}

更新:上面的图片网址在Chrome浏览器中可以打开,但在Safari浏览器中打不开,有什么原因吗?

【问题讨论】:

  • 能否将您的扩展程序的encoded 方法显示为String?我用测试图像测试了你的代码,seems good
  • 更新问题请查收
  • encoded 很好。使用此链接进行测试https://via.placeholder.com/468x60?text=Visit Blogging.com Now - 将其完美编码为https://via.placeholder.com/468x60?text=Visit%20Blogging.com%20Now。问题在于您的图片链接。
  • 但 90% 的 url 在应用程序中运行良好,只有少数 url 无法运行
  • 同样的 url 在 android 应用程序和网络浏览器中也可以正常工作

标签: ios swift iphone uiimageview sdwebimage


【解决方案1】:

-1100 表示NSURLErrorFileDoesNotExist。还有一种可能是,服务器没有返回文件to specific country 或由于urlString 中的specific symbols。在这种情况下,您可以应用以下编码:stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding。 您也可以使用SDWebImageRetryFailed,如documentation 中所述,更多关于this flag

storeImg.sd_setImage(with: urlEncoded, placeholderImage: UIImage(named: Constants.storeImagePlaceorderImage), options: .retryFailed) { // handle result completion }

您可以使用以下方法测试损坏的链接:

import UIKit
import SDWebImage
import WebKit

extension String {
    var encoded: String {
        return self.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
    }
}

class ViewController: UIViewController {
    let testURL = "https://i.groupme.com/638x640.jpeg.d4f31c747b534baca03d12db5a2b6193"
    let testURLShouldEncode = "https://via.placeholder.com/468x60?text=Visit Blogging.com Now"

    var storeImg: UIImageView!
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        configureUI()

        if let urlEncoded = URL(string: testURLShouldEncode.encoded), !(testURL.isEmpty) {
            storeImg.sd_setImage(with: urlEncoded, placeholderImage: UIImage(named: Constants.storeImagePlaceorderImage)) { 
                [unowned self] (image, error, cahce, url) in
                print("image \(String(describing: image))")
                print("error \(String(describing: error?.localizedDescription))")
                print("cache \(cahce)")
                print("url \(String(describing: url))")
                if (error != nil) {
                    let request = URLRequest(url: urlEncoded)
                    self.webView.load(request)
                }
            }
        } else {
            self.storeImg.image = UIImage(named: Constants.storeImagePlaceorderImage)
        }
    }

    func configureUI() {
        storeImg = UIImageView()
        storeImg.contentMode = .center
        storeImg.translatesAutoresizingMaskIntoConstraints = false

        webView = WKWebView()
        webView.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(storeImg)
        view.addSubview(webView)

        view.backgroundColor = .blue
        storeImg.backgroundColor = .yellow
        webView.backgroundColor = .orange

        storeImg.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        storeImg.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        storeImg.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        storeImg.heightAnchor.constraint(equalToConstant: 300).isActive = true

        webView.topAnchor.constraint(equalTo: storeImg.safeAreaLayoutGuide.bottomAnchor).isActive = true
        webView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        webView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    }
}

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,我的解决方案是通过将"SD_WEBP=1" 添加到您的SDWebImage 目标 -> Build Settings -> Preprocessor Macros 来完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多