簡體   English   中英

清除 UserDefaults.standard.data 信息實際上並沒有刪除它?

[英]Clearing UserDefaults.standard.data information doesn't actually delete it?

我使用此代碼將 UIImage 保存到 UserDefaults via.data,其中鍵等於“petPhoto1”:

@IBAction func addPhotoButton(_ sender: Any) {
        
        let picker = UIImagePickerController()
        picker.allowsEditing = false
        picker.delegate = self
        picker.mediaTypes = ["public.image"]
        present(picker, animated: true)
        
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
        
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            image.storeInUserDefaults(for: "petPhoto\(activePet)")
            UserDefaults.standard.set("yes", forKey: "doesImageExist\(activePet)")
        }
        
        dismiss(animated: true, completion: nil)
    }

(中間不相關的東西)

extension UIImage {
    func storeInUserDefaults(with compressionQuality: CGFloat = 0.8, for key:     String) {
    guard let data = self.jpegData(compressionQuality: compressionQuality) else { return }
    let encodedImage = try! PropertyListEncoder().encode(data)
    UserDefaults.standard.set(encodedImage, forKey: key)
    }
}

現在,當我像這樣擦除它時:

UserDefaults.standard.set(nil, forKey: "petPhoto1")

我仍然可以看到我的應用程序在設置下的“文檔和數據”仍然是完整的,大小與原始圖像相同,這表明它實際上並沒有刪除它,即使它從 UserDefaults 加載回來時不再顯示.

誰能想辦法解決這個問題? 謝謝!

順便說一句,如果有幫助,這里是與此問題相關的其他代碼:

我在保存圖像后顯示圖像的 ImageViewController 中使用的代碼:

@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
        super.viewDidLoad()
        
        activePet = UserDefaults.standard.string(forKey: "activePet")! // activePet = 1 (confirmed with debugging with other, unrelated code
        
        imageView.image = try? UIImage.loadFromUserDefaults(with: "petPhoto\(activePet)")
        
    }

extension UIImage {
    static func loadFromUserDefaults(with key: String) throws -> UIImage? {
         let activePet = UserDefaults.standard.string(forKey: "activePet")!
         guard let data = UserDefaults.standard.data(forKey: "petPhoto\(activePet)") else {
             return nil
         }
         do {
             let decodedImageData = try PropertyListDecoder().decode(Data.self, from: data)
             return UIImage(data: decodedImageData)
         } catch let error {
             throw error
         }
     }
}

當你這樣做時:

UserDefaults.standard.set(nil, forKey: "petPhoto1")

密鑰和保存的文件之間的鏈接將被同步刪除。 這意味着如果您嘗試訪問此鍵的值,它會返回 nil。

但是這個圖像也需要從存儲中清除,這將異步發生[我們沒有來自蘋果的完成處理程序 API 支持來獲取此信息]。

蘋果文檔供參考:

在運行時,您使用 UserDefaults 對象從用戶的默認數據庫中讀取您的應用使用的默認值。 UserDefaults 緩存信息以避免每次需要默認值時都必須打開用戶的默認數據庫。 當您設置默認值時,它會在您的進程中同步更改,並異步更改為持久存儲和其他進程。

你可以嘗試什么:

第一種方法

給一些時間讓操作系統完成文件刪除操作。 然后嘗試訪問磁盤中的圖像。

第二種方法

嘗試使用 GCD 觀察目錄中的更改。 參考: https://stackoverflow.com/a/26878163/5215474

暫無
暫無

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

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