从我的 S3 存储桶加载图像和滚动 tableview 时冻结
Freezing while loading image from my S3 bucket and while scrolling tableview
我一直在开发一个加载大量图像的应用程序。我有一个 table 视图单元格,每个视图单元格都有一个图像。
图像存储在 S3 存储桶中。
每张图片都很大,大约 720 KB,每次我滚动屏幕时都会冻结一点以获取整张图片。
这是我获取图像的代码
let url: String = "\(K.baseURLForImage)\(cellImageURL)"
let validURL = URL(string: url)
if let imageData = try? Data(contentsOf: validURL!) {
let image = UIImage(data: imageData)
cell.cellImage.image = image
}
当然不是很好,那么我有什么办法可以解决这个问题吗?
听说不用dequeueReusableCell
不好
提前致谢。
编辑
我添加了这些行
if let validURL = URL(string: url) {
task = URLSession.shared.dataTaskPublisher(for: validURL)
.sink(receiveCompletion: { completion in
// error handling
print("failed URL: '\(url)'")
}, receiveValue: { (data, response) in
image = UIImage(data: data)
})
return image
} else {
return nil
}
但是我每次调用这个函数都会得到nil
。
我检查了图像的 URL 是否有效。
如上所述,Data(contentsOf:)
是一个阻塞调用,调用它的线程上的任何 activity 都将停止,包括从主线程调用的情况。
切换到使用 URLSession
函数之一。
一个可能的例子:
import Combine
let url = "https://via.placeholder.com/150"
var task: AnyCancellable? // Do not let this go out of scope until data is loaded
if let validURL = URL(string: url) {
task = URLSession.shared.dataTaskPublisher(for: validURL)
.sink(receiveCompletion: { completion in
// error handling
}, receiveValue: { (data, response) in
let image = UIImage(data: data)
cell.cellImage.image = image
})
}
我用 Kingfisher 解决了我的问题!
这是我的代码
import Kingfisher
let url: String = "some url"
let validURL = URL(string: url)
KF.url(validURL!)
.set(to: cell.cellImage)
return cell
我一直在开发一个加载大量图像的应用程序。我有一个 table 视图单元格,每个视图单元格都有一个图像。
图像存储在 S3 存储桶中。
每张图片都很大,大约 720 KB,每次我滚动屏幕时都会冻结一点以获取整张图片。
这是我获取图像的代码
let url: String = "\(K.baseURLForImage)\(cellImageURL)"
let validURL = URL(string: url)
if let imageData = try? Data(contentsOf: validURL!) {
let image = UIImage(data: imageData)
cell.cellImage.image = image
}
当然不是很好,那么我有什么办法可以解决这个问题吗?
听说不用dequeueReusableCell
不好
提前致谢。
编辑
我添加了这些行
if let validURL = URL(string: url) {
task = URLSession.shared.dataTaskPublisher(for: validURL)
.sink(receiveCompletion: { completion in
// error handling
print("failed URL: '\(url)'")
}, receiveValue: { (data, response) in
image = UIImage(data: data)
})
return image
} else {
return nil
}
但是我每次调用这个函数都会得到nil
。
我检查了图像的 URL 是否有效。
如上所述,Data(contentsOf:)
是一个阻塞调用,调用它的线程上的任何 activity 都将停止,包括从主线程调用的情况。
切换到使用 URLSession
函数之一。
一个可能的例子:
import Combine
let url = "https://via.placeholder.com/150"
var task: AnyCancellable? // Do not let this go out of scope until data is loaded
if let validURL = URL(string: url) {
task = URLSession.shared.dataTaskPublisher(for: validURL)
.sink(receiveCompletion: { completion in
// error handling
}, receiveValue: { (data, response) in
let image = UIImage(data: data)
cell.cellImage.image = image
})
}
我用 Kingfisher 解决了我的问题!
这是我的代码
import Kingfisher
let url: String = "some url"
let validURL = URL(string: url)
KF.url(validURL!)
.set(to: cell.cellImage)
return cell