由于声明了一个常数而在第3行出现错误,为什么会出现这种情况?错误:扩展名不能包含存储的属性代码:
extension UIImageView {
let imageCache = NSCache<NSString, UIImage>() //error
func imageFromServerURL(_ URLString: String, placeHolder: UIImage?) {
self.image = nil
//If imageurl's imagename has space then this line going to work for this
let imageServerUrl = URLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
if let cachedImage = imageCache.object(forKey: NSString(string: imageServerUrl)) {
self.image = cachedImage
return
}
if let url = URL(string: imageServerUrl) {
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
//print("RESPONSE FROM API: \(response)")
if error != nil {
print("ERROR LOADING IMAGES FROM URL: \(String(describing: error))")
DispatchQueue.main.async {
self.image = placeHolder
}
return
}
DispatchQueue.main.async {
if let data = data {
if let downloadedImage = UIImage(data: data) {
self.imageCache.setObject(downloadedImage, forKey: NSString(string: imageServerUrl))
self.image = downloadedImage
}
}
}
}).resume()
}
}
}
我使用了这段代码,但不明白为什么它不起作用:Swift异步加载图像
是,扩展可能不会添加存储的属性。这可能是最好的方法,这样您的类不会因为库而增加大小,因为库通过添加一些额外的信息来扩展您的类,而这些信息对您来说很可能是不感兴趣的。
但在您的情况下,您可能甚至不想拥有一个存储的财产。您的编码方式意味着您的每个UIIimageView
实例都有自己的缓存。因此,例如,每个单元格显示图像视图的表视图意味着每个可见单元格的缓存,这导致同一图像的多次下载,而不是共享它。
在您的情况下,解决此问题的最佳方案可能是使其静态化:
extension UIImageView {
private static let imageCache = NSCache<NSString, UIImage>()
private var imageCache: NSCache<NSString, UIImage> { UIImageView.imageCache }
func imageFromServerURL(_ URLString: String, placeHolder: UIImage?) {
self.image = nil
// If image url's image name has space then this line going to work for this
let imageServerUrl = URLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
if let cachedImage = imageCache.object(forKey: NSString(string: imageServerUrl)) {
self.image = cachedImage
return
}
if let url = URL(string: imageServerUrl) {
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
//print("RESPONSE FROM API: \(response)")
if error != nil {
print("ERROR LOADING IMAGES FROM URL: \(String(describing: error))")
DispatchQueue.main.async {
self.image = placeHolder
}
return
}
DispatchQueue.main.async {
if let data = data {
if let downloadedImage = UIImage(data: data) {
self.imageCache.setObject(downloadedImage, forKey: NSString(string: imageServerUrl))
self.image = downloadedImage
}
}
}
}).resume()
}
}
}
撇开你的问题不谈,你应该知道你试图解决的任务可能没有你提供的代码那么容易。我在您的代码中看到至少有2个主要问题:
而且可能还有更多的。例如,这都在内存中。在内存耗尽之前,您希望可以缓存多少映像?也许最好将它移到某个文件系统中。
As扩展不能包含存储的属性,因此您可以将其设为全局变量,并从self.imageCache.setObject(downloadedImage,forkey:NSString(string:imageServerUrl))
中删除self
let imageCache = NSCache<NSString, UIImage>()
或
class SubImg: UIImageView {}
当我激活这个插件时,它会向我显示错误,我如何解决这个问题? 致命错误:未捕获错误:在C:\xampp\htdocs\www\real\wp content\plugins\realtyelite theme plugin\inc\vc函数中调用未定义的函数vc\u add\u shortcode\u param()。php:3堆栈跟踪:#0 C:\xampp\htdocs\www\real\wp
我的IDE是Eclipse IDE 2020.03,使用由gradlew setDecompWorkspace和gradlew eclipse制作的Minecraft mods目录 我已经尝试将-vm目录更改为jdk 1.8.0和jre/bin/javaw.exe 错误显示:错误:无法创建Java虚拟机。错误:发生致命异常。程序将退出。 代码和eclipse。ini看起来像这样:
我使用Android Studios 1.5 我正在尝试做一些非常简单的事情:在我的项目中添加一个大的图像,作为我主要活动的背景。当我右键单击res时- 我做错了什么?我读过好几页,没有其他人有过这个问题。
我犯了以下错误: 03-11 20:02:47.240:E/AndroidRuntime(1577):致命异常:main 03-11 20:02:47.240:E/AndroidRuntime(1577):java。lang.NoClassDefFoundError:com。收拾一下。毕加索毕加索 03-11 20:02:47.240:E/AndroidRuntime(1577):在com。实例消
例外情况: org.apache.tomcat.util.net.nioEndpoint$socketprocessor.dorun(NioEndpoint.java:1376)org.apache.tomcat.util.net.socketprocessorbase.run(Socketprocessorbase.java:49)java.base/java.util.concurrent.t