ios - 从 URL 获取图像并将其附加到数组
问题描述
我正在尝试images
从 a获取URL
并将它们附加到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")
}
}
此代码不起作用,因为它总是退出并打印<imageName> does not exist!
。奇怪的是,这fileName
是一个正确的名字!
例如:
这就是我download
的方式image
:URL
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()
}
}
有谁知道为什么我不能附加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!")
}
}
}
}
推荐阅读
- html - 如何使用 HTML 和 CSS 在边框中间实现标题
- sockets - 回调功能是否在内部使用 select() 调用?
- azure - Howto:Azure DevOps YAML 中的动态变量名称解析
- c# - 使用 C# 在 Visual Studio 或 VSCode 中未出现错误
- graphql - 除了 Apollo,还有其他 GraphQL Federation 实现吗?
- file-upload - iOS Safari 13.3.1 上传的文件大小为 0
- javascript - 确保 Javascript 中顺序命令的最有效方法
- c# - 启动浏览器时 PuppeteerSharp 抛出 ChromiumProcessException “无法创建连接”
- python - Python - 如何按非字母数字拆分字符串,但同时保留任何非字母数字
- python - DRF:如何在另一个类方法中调用一个类?