使用Firebase检索图像会给出:EXC_BAD_ACCESS(代码= 1,地址= 0x10)

时间:2018-07-20 00:50:48

标签: ios swift firebase firebase-realtime-database

因此,我正在尝试缓存从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()

}

}

第一次出现时,视图会加载图像,但是下次出现时,会发生这种情况:

  • 图像不会从缓存中加载
  • 我收到以下错误: Error

我注意到它在打印“无错误”后崩溃。

我想知道是什么原因导致了我的问题以及如何解决。我认为这与完成处理程序有关,因为错误行暗示了这一点。

我也曾尝试在我的completionHandler内部设置缓存,但是什么也没有发生。我在做什么错了?

2 个答案:

答案 0 :(得分:1)

请检查fetcherCompletion是否为野生指针,例如添加NSLog(@"%@",weakSelf.fetcherCompletion)

如果是这样,则可能是Firebase的错误。 fetcherCompletion的属性应添加copystrong

答案 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")
    }
}

如果任何人都可以解释其工作原理,将不胜感激:)