gpt4 book ai didi

swift - 异步加载图像并返回 UIImage 的公共(public)函数

转载 作者:行者123 更新时间:2023-11-28 05:29:27 24 4
gpt4 key购买 nike

我正在尝试编写异步加载图像并返回 UIImage 的公共(public)函数。我想用它来用图像填充 UITableView。

class CommonFunctions {

func loadImageAsync(StringURL: NSString) -> UIImage{

var returningImage = UIImage()

let url = NSURL(string: StringURL)

let requestedURL = NSURLRequest(URL: url!)

NSURLConnection.sendAsynchronousRequest(requestedURL, queue: NSOperationQueue.mainQueue(), completionHandler: {
response, data, error in

if error != nil {
println("there is some error loading image")
}
else {

if let image = UIImage(data: data){
returningImage = image
}
}
})
return returningImage
}

}

问题是当我想使用这个函数时:

cell.imageModelImage.image = CommonFunctions.loadImageAsync(CommonFunctions)

我得到的不是字符串参数,而是类?为什么会这样?

最佳答案

你问:

Instead of String argument I get the class? Why is that so?

这是因为你把它当作一个类函数来调用,但没有这样定义它。如果您在函数声明中添加 class 关键字,您将看不到该行为。

但这里还有更深层次的问题:您不能从异步函数返回值(因为该函数将立即返回,而异步请求直到稍后才会完成)。

一个解决方案是提供一个完成处理程序,如果成功检索到图像,将调用该处理程序:

class func loadImageAsync(stringURL: String, completion: @escaping (UIImage?, Error?) -> Void) {
let url = URL(string: stringURL)!

URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
DispatchQueue.main.async { completion(nil, error) }
return
}
let image = UIImage(data: data)
DispatchQueue.main.async { completion(image, nil) }
}.resume()
}

请注意,我将完成处理程序分派(dispatch)回主队列,所有 UI 更新都应在主队列中进行。

然后,在 tableView(_:cellForRowAt:) 中,您可以提供一个将在异步请求完成时调用的 block :

cell.imageModelImage.image = ... // remember to initialize image view before starting async method
CommonFunctions.loadImageAsync(with: "http://example.com/test.jpg") { image, error in
if let cell = tableView.cellForRow(at: indexPath) as? CustomCell { // make sure cell hasn't scrolled out of view
cell.imageModelImage.image = image
}
}

请注意,以上假设不可能在中间时间段内在表中插入一行。如果该假设无效,而不是使用旧的 indexPath,您可能会重新查询您的模型以确定在调用异步完成处理程序时哪些 IndexPath 对此单元格有效.

有关 Swift 2 版本,请参阅 previous revision这个答案。

关于swift - 异步加载图像并返回 UIImage 的公共(public)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29469457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com