![](/img/trans.png)
[英]Why can we chain flatMap to 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.