簡體   English   中英

從 URL 和 append 獲取圖像到數組

[英]Getting Image from URL and append it to array

我正在嘗試從URL和 append 獲取images到一個array 這如果我的function為它:

func doStuff(html: String?){
    do {
        let doc: Document = try SwiftSoup.parse(html ?? "")

        let priceClasses: Elements? = try doc.select("[class~=(?i)price]")

            for priceClass: Element in priceClasses!.array() {
            let priceText : String = try priceClass.text()
            print(try priceClass.className())
            print("pricetext: \(priceText)")
        }

        let srcs: Elements = try doc.select("img[src]")
        let srcsStringArray: [String?] = srcs.array().map { try? $0.attr("src").description }

        for imageName in srcsStringArray {
            if (imageName?.matches("^https?://(?:[a-z0-9\\-]+\\.)+[a-z]{2,6}(?:/[^/#?]+)+\\.(?:jpg|gif|png)$"))! {
                print(imageName!)

                let imageView = UIImageView()
                imageView.downloaded(from: imageName!) {

                    if let image = imageView.image {
                        self.imagesArray!.append(image)
                    } else {
                        print("Image '\(String(describing: imageName))' does not exist!")
                    }

                }
            }

        }

    } catch Exception.Error( _, let message) {
        print(message)
    } catch {
        print("error")

    }
}

此代碼不起作用,因為它總是退出並且 print <imageName> does not exist! . 奇怪的是fileName是正確的名稱!

例如:

https://www.adidas.de/on/demandware.static/-/Sites-adidas-DE-Library/default/dw817801e3/Originals_Brand_Nav_Title.png

這就是我從URL download image的方式:

extension UIImageView {
func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
    contentMode = mode
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
            let data = data, error == nil,
            let image = UIImage(data: data)
            else { return }
        DispatchQueue.main.async() {
            self.image = image
        }
    }.resume()
}
func downloaded(from link: String, contentMode mode: UIView.ContentMode = .scaleAspectFit, finished: () -> Void) {
    guard let url = URL(string: link) else { return }
    downloaded(from: url, contentMode: mode)
    finished()
}
}

有誰知道為什么我不能 append images到我的array 我卡住了。。

我通過更改load image的方式解決了這個問題:

extension UIImage {

public static func loadFrom(url: URL, completion: @escaping (_ image: UIImage?) -> ()) {
    DispatchQueue.global().async {
        if let data = try? Data(contentsOf: url) {
            DispatchQueue.main.async {
                completion(UIImage(data: data))
            }
        } else {
            DispatchQueue.main.async {
                completion(nil)
            }
        }
    }
}

}

有了這個,我只需調用:

for imageName in srcsStringArray {
            if (imageName?.matches("^https?://(?:[a-z0-9\\-]+\\.)+[a-z]{2,6}(?:/[^/#?]+)+\\.(?:jpg|gif|png)$"))! {

                guard let url = URL(string: imageName!) else { return }

                UIImage.loadFrom(url: url) { image in

                    if let image = image {
                        print("append")
                       self.imagesArray.append(image)
                    } else {
                        print("Image '\(String(describing: imageName))' does not exist!")
                    }

                }
            }

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM