异步获取图像 Firebase Swift 5
Async fetching image Firebase Swift 5
我在 CellForRowAt 中使用这段代码来显示图像。滚动很流畅,但网络调试告诉我每次滚动 table 时它仍然会下载图像。
我怎样才能一次下载所有图片?
if let url = URL( string: rest1.image) {
DispatchQueue.global().async {
if let data = try? Data(contentsOf: url) {
DispatchQueue.main.async {
cell.RestaurantImage.image = UIImage(data: data)
}
}
}
}
您需要使用 NSCache
来保存和检索图像。从网络中获取图像后,将其存储在缓存中,并从下一次从缓存中加载图像。使用键 NSString
和值 NSData
创建 NSCache
的实例,因为 NSCache 只允许 class 类型。这是一个例子:
在 cellForItem
方法之外创建图像缓存,或者您可以将其创建为全局缓存,如下所示:
let imageCache = NSCache<NSString, NSData>()
然后在cellForItem
方法中:
if let url = URL(string: rest1.image) {
if let data = imageCache.object(forKey: rest1.image as NSString) {
cell.RestaurantImage.image = UIImage(data: data as Data)
} else {
DispatchQueue.global().async {
if let data = try? Data(contentsOf: url) {
imageCache.setObject(data as NSData, forKey: rest1.image as NSString)
DispatchQueue.main.async {
cell.RestaurantImage.image = UIImage(data: data)
}
}
}
}
}
我在 CellForRowAt 中使用这段代码来显示图像。滚动很流畅,但网络调试告诉我每次滚动 table 时它仍然会下载图像。 我怎样才能一次下载所有图片?
if let url = URL( string: rest1.image) {
DispatchQueue.global().async {
if let data = try? Data(contentsOf: url) {
DispatchQueue.main.async {
cell.RestaurantImage.image = UIImage(data: data)
}
}
}
}
您需要使用 NSCache
来保存和检索图像。从网络中获取图像后,将其存储在缓存中,并从下一次从缓存中加载图像。使用键 NSString
和值 NSData
创建 NSCache
的实例,因为 NSCache 只允许 class 类型。这是一个例子:
在 cellForItem
方法之外创建图像缓存,或者您可以将其创建为全局缓存,如下所示:
let imageCache = NSCache<NSString, NSData>()
然后在cellForItem
方法中:
if let url = URL(string: rest1.image) {
if let data = imageCache.object(forKey: rest1.image as NSString) {
cell.RestaurantImage.image = UIImage(data: data as Data)
} else {
DispatchQueue.global().async {
if let data = try? Data(contentsOf: url) {
imageCache.setObject(data as NSData, forKey: rest1.image as NSString)
DispatchQueue.main.async {
cell.RestaurantImage.image = UIImage(data: data)
}
}
}
}
}