gpt4 book ai didi

ios - 使用图像缓存时展开 [String] 的问题

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

我正在尝试重写我的图像缓存以摆脱对 Alamofire 的使用,但这样做时我遇到了错误。以前,我的图像缓存代码是:

let imageCache = NSCache<NSString, UIImage>()

extension UIImageView {

func loadImageUsingCacheWithUrlString(_ urlString: String) {

self.image = nil

// Check cache for image first
if let cachedImage = imageCache.object(forKey: urlString as NSString) {
self.image = cachedImage
return
}

// Otherwise fire off a new download
Alamofire.request(urlString)
.responseImage { response in

if let downloadedImage = response.result.value {
// image is here.
imageCache.setObject(downloadedImage, forKey: urlString as NSString)
self.image = downloadedImage
}
}
}
}

使用示例如下:

navBarCell.avatarImageView.loadImageUsingCacheWithUrlString(avatars[indexPath.row])

现在我重写了缓存:

class ImageService {

static let cache = NSCache<NSString, UIImage>()

static func downloadImage(url: URL, completion: @escaping (_ image: UIImage?) -> (Void)) {

URLSession.shared.dataTask(with: url) { (data, response, error) in

guard let data = data else {return}
var downloadedImage: UIImage?
downloadedImage = UIImage(data: data)

if downloadedImage != nil {
cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
}
DispatchQueue.main.async {
completion(downloadedImage)
}
}.resume()
}

static func getImage(url: URL, completion: @escaping (_ image: UIImage?) -> (Void)) {

if let image = cache.object(forKey: url.absoluteString as NSString) {
completion(image)
} else {
downloadImage(url: url, completion: completion)
}
}

}

并在与上述相同的场景中使用它:

        if let avatarImageUrlString = self.chatVC?.avatarDictionary.allValues as! [String], let imageUrl = URL(string: avatarImageUrlString) {
ImageService.getImage(url: imageUrl, completion: { (image) -> (Void) in
navBarCell.avatarImageView.image = image
})
}

我在 if let 语句中收到错误 Initializer for conditional binding must have Optional type, not '[String]'

我不确定如何处理这个 - 我需要 [String] 数组,但如果我正确理解错误,它需要是一个可选的,而不是用 强制解包作为! [字符串]?如果这是一个新手问题,我深表歉意,但我似乎无法让它发挥作用。

感谢您的指导!

编辑:

我试过将 let avatarImageUrlString.... 放在 if let 之外:

        let avatarImageUrlString = self.chatVC?.avatarDictionary.allValues as! [String]

if let imageUrl = URL(string: avatarImageUrlString) {
ImageService.getImage(url: imageUrl, completion: { (image) -> (Void) in
navBarCell.avatarImageView.image = image
})
}

但是在 if let 行出现错误 Cannot convert value of type '[String]' to expected argument type 'String'

我也试过删除 ! 并且我收到错误消息 '[Any]?'不可转换为“[String]”;你是不是想用 'as!'强制向下转换? 修复建议将 ! 放回:将 'as' 替换为 'as!'

编辑 2:

        if let avatarImageUrlString = self.chatVC?.avatarDictionary.allValues as? [String], let imageUrl = URL(string: avatarImageUrlString[0]) {
ImageService.getImage(url: imageUrl, completion: { (image) -> (Void) in
navBarCell.avatarImageView.image = image
})
}

编辑 3:

        let avatars = self.chatVC?.avatarDictionary.allValues[indexPath.row] as? [String]

if let avatarImageUrlString = avatars, let imageUrl = URL(string: avatarImageUrlString[0]) {
ImageService.getImage(url: imageUrl, completion: { (image) -> (Void) in
navBarCell.avatarImageView.image = image
})
}

最佳答案

您实际上是将 allValues 强制解包为 [String],因此没有什么可沮丧的。还将类型从字符串数组更改为单个字符串

所以在可选绑定(bind)中不用这个

as! [String]

用这个

as? String

所以...

if let avatarImageUrlString = self.chatVC?.avatarDictionary.allValues[indexPath.row] as? String, let imageUrl = URL(string: avatarImageUrlString) {
...
}

关于ios - 使用图像缓存时展开 [String] 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53711336/

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