因此,我正在尝试缓存从Firebase检索的图像:
class AccountSettings: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{
@IBOutlet weak var profileImage: UIImageView!
var imageRef: StorageReference{
return Storage.storage().reference().child("profile_images")
}
let cache = NSCache<NSString, UIImage>()
var activityIndicator = UIActivityIndicatorView()
override func viewDidLoad() {
activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
activityIndicator.frame = CGRect(x: 0, y: 0, width: 46, height: 46)
activityIndicator.hidesWhenStopped = true
profileImage.addSubview(activityIndicator)
activityIndicator.startAnimating()
if let image = cache.object(forKey: "\(UserDefaults.standard.string(forKey: "unique_id")!).jpg" as NSString){
profileImage.image = image
}else{
retrieveCurrentProfileImg()
}
}
func retrieveCurrentProfileImg(){
let downloadImageRef = imageRef.child("\(UserDefaults.standard.string(forKey: "unique_id")!).jpg")
let downloadTask = downloadImageRef.getData(maxSize: 1024*1024*12) { (data, error) in
if let data = data{
let image = UIImage(data: data)
self.profileImage.image = image
self.cache.setObject(image!, forKey: "\(UserDefaults.standard.string(forKey: "unique_id")!).jpg" as NSString)
self.activityIndicator.stopAnimating()
}
print(error ?? "No error")
}
downloadTask.observe(.progress) { (snapshot) in
}
downloadTask.resume()
}
}
第一次出现时,视图会加载图像,但是下次出现时,会发生这种情况:
我注意到它在打印“无错误”后崩溃。
我想知道是什么原因导致了我的问题以及如何解决。我认为这与完成处理程序有关,因为错误行暗示了这一点。
我也曾尝试在我的completionHandler内部设置缓存,但是什么也没有发生。我在做什么错了?
答案 0 :(得分:1)
请检查fetcherCompletion是否为野生指针,例如添加NSLog(@"%@",weakSelf.fetcherCompletion)
如果是这样,则可能是Firebase的错误。 fetcherCompletion的属性应添加copy
或strong
。
答案 1 :(得分:0)
我不知道为什么,但这似乎可以解决问题:
func retrieveCurrentProfileImg(){
var downloadImageRef = imageRef.child("\(UserDefaults.standard.string(forKey: "unique_id")!).jpg")
print(downloadImageRef)
downloadImageRef.getData(maxSize: 1024*1024*12) { (dataResponse, errorResponse) in
if let data = dataResponse{
let image = UIImage(data: data)
self.profileImage?.image = image
}
print(errorResponse ?? "No error")
}
}
如果任何人都可以解释其工作原理,将不胜感激:)