簡體   English   中英

如何防止即使沒有Internet連接也不斷從Firebase下載圖像並顯示圖像?

[英]How to prevent constantly downloading an image from Firebase and show the image even if there is no internet connection?

每次顯示個人資料圖片時, UIImageView閃爍,以表示該圖像是剛從Firebase存儲URL下載的。 此下載速度因設備類型而異,有時不太明顯,而另一些時候則存在明顯的延遲。

我曾嘗試使用NSCacheKingfisher庫來緩存圖像,但是我仍然看到UIImageView閃存,而不是每次重新打開應用程序時都停留在那里。

我最后的嘗試是將圖像保存到文檔目錄,然后從那里檢索它,但是我仍然看到圖像閃爍。 即使應用程序在沒有任何互聯網連接的情況下打開,我也希望個人資料圖片保留在那里。

func saveImageDocumentDirectory(imgUrl: URL){
    let fileManager = FileManager.default
    let paths =     (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("proPic.png")
    let data = (try? Data(contentsOf: imgUrl))
    let image = UIImage(data: data!)
    print("\n\(paths)\n")
    let imageData = image!.pngData()
    fileManager.createFile(atPath: paths as String, contents: imageData, attributes: nil)
}


func getDirectoryPath() -> String {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

func getImage(){
    let fileManager = FileManager.default
    let imagePAth = (self.getDirectoryPath() as NSString).appendingPathComponent("proPic.png")
    if fileManager.fileExists(atPath: imagePAth){
        self.profilePic.image = UIImage(contentsOfFile: imagePAth)
    }else{
        print("\nNo Image\n")
    }
}

func createDirectory(){
    let fileManager = FileManager.default
    let paths = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("customDirectory")
    if !fileManager.fileExists(atPath: paths){
        try! fileManager.createDirectory(atPath: paths, withIntermediateDirectories: true, attributes: nil)
    }else{
        print("\nAlready dictionary created.\n")
    }
}

我將通過以下方式調用該函數:

func getEmailPic(){


    guard let uid = Auth.auth().currentUser?.uid else {return}

    //receive the location of the profile pic
    let storageRef = Storage.storage().reference().child(uid).child("profilePic.png");

    //how to access the downloadURL
    _ = storageRef.downloadURL(completion: { (URLe, error) in
    if let error = error{

        //error handling
        print("\nCould not download user's profile image from url. 
     Error: \(error.localizedDescription)\n");
        return;
    }

            self.createDirectory()
            self.saveImageDocumentDirectory(imgUrl: URLe!)
            print("\nThis is the URL: \(URLe)\n")
            self.getImage()

    })

}

在viewDidLoad中。

使用翠鳥進行圖像緩存,嘗試一下並隨意詢問是否遇到任何問題

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    // set profile image if you have url saved in userdefaults
    let imageUrl = getUrlImageFromUserDefaults()
    let placeholderImage = UIImage(named: "placeholder")
    profileImageView.kf.setImage(with: imageUrl, placeholder: placeholderImage)
    getEmailPic()
}

func getUrlImageFromUserDefaults() -> URL?{
    // save image URL to userdefault and fetch here
    let userdefaults = UserDefaults.standard

    return userdefaults.url(forKey: "profileURL")
}
func getEmailPic(){


    guard let uid = Auth.auth().currentUser?.uid else {return}

    //receive the location of the profile pic
    let storageRef = Storage.storage().reference().child(uid).child("profilePic.png");

    //how to access the downloadURL
    _ = storageRef.downloadURL(completion: { (URLe, error) in
        if let error = error{

            //error handling
            print("\nCould not download user's profile image from url.
                Error: \(error.localizedDescription)\n");
                return;
        }

        if URLe == getUrlImageFromUserDefaults() {
            // if url is same no need to set again
        }else{
            // set profile image
            let placeholderImage = UIImage(named: "placeholder")
            profileImageView.kf.setImage(with: URLe, placeholder: placeholderImage)
            // and again save this new URL to userdefaults
        }

    })

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM