使用 UserDefaults 终止时保留应用程序
Persist app when terminate using UserDefaults
我想使用 userdefaults 保存图像,我想要实现的是在图像被更改并且应用程序终止它之后。图像用户更改仍然存在。我如何使用 userdefaults 实现此目的。
这是我在用户选择图像并将其保存在 userdefaults 时的代码
var data: Data? //I make a reference data to save imageData in pickerController
@objc func handleImagePicker() {
let imagePickerController = UIImagePickerController()
imagePickerController.allowsEditing = true
imagePickerController.sourceType = .photoLibrary
imagePickerController.delegate = self
present(imagePickerController, animated: true)
}
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let editedImage = info[.editedImage] as? UIImage {
guard let imageData = editedImage.jpegData(compressionQuality: 0.5) else { return }
self.data = NSKeyedArchiver.archivedData(withRootObject: imageData)
UserDefaults.standard.set(data, forKey: "profileImageEditedKey")
UserDefaults.standard.synchronize()
profileImageView.image = editedImage.withRenderingMode(.alwaysOriginal)
} else if let originalImage = info[.originalImage] as? UIImage {
guard let imageData = originalImage.jpegData(compressionQuality: 1) else { return }
self.data = NSKeyedArchiver.archivedData(withRootObject: imageData)
UserDefaults.standard.set(data, forKey: "profileImageOriginalKey")
UserDefaults.standard.synchronize()
profileImageView.image = originalImage.withRenderingMode(.alwaysOriginal)
}
dismiss(animated: true)
}
这是我在应用程序终止后获取数据时放置在 viewWillAppear 中的代码
private func fetchData() {
guard let data = data else { return }
guard let image = NSKeyedUnarchiver.unarchiveObject(with: data) as? UIImage else { return }
profileImageView.image = image.withRenderingMode(.alwaysOriginal)
print("fetch...")
}
在userdefaults
中保存大数据不是一个好主意,通常不推荐,因为这不是保存图像的最有效方式;一种更有效的方法是将图像保存在应用程序的文档目录中。你使用 Data
write
func 来做到这一点。
还有其他第三个库。
如果你坚持使用UserDefaults
保存图片
guard let imageData = editedImage.jpegData(compressionQuality: 0.5) else { return }
UserDefaults.standard.set(imageData, forKey: "profileImageEditedKey")
UserDefaults.standard.synchronize()
从UserDefaults
获取图像
guard let data = UserDefaults.standard.object(forKey: "profileImageOriginalKey") as? Data else {
return;
}
let image = UIImage.init(data: data);
我想使用 userdefaults 保存图像,我想要实现的是在图像被更改并且应用程序终止它之后。图像用户更改仍然存在。我如何使用 userdefaults 实现此目的。
这是我在用户选择图像并将其保存在 userdefaults 时的代码
var data: Data? //I make a reference data to save imageData in pickerController
@objc func handleImagePicker() {
let imagePickerController = UIImagePickerController()
imagePickerController.allowsEditing = true
imagePickerController.sourceType = .photoLibrary
imagePickerController.delegate = self
present(imagePickerController, animated: true)
}
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let editedImage = info[.editedImage] as? UIImage {
guard let imageData = editedImage.jpegData(compressionQuality: 0.5) else { return }
self.data = NSKeyedArchiver.archivedData(withRootObject: imageData)
UserDefaults.standard.set(data, forKey: "profileImageEditedKey")
UserDefaults.standard.synchronize()
profileImageView.image = editedImage.withRenderingMode(.alwaysOriginal)
} else if let originalImage = info[.originalImage] as? UIImage {
guard let imageData = originalImage.jpegData(compressionQuality: 1) else { return }
self.data = NSKeyedArchiver.archivedData(withRootObject: imageData)
UserDefaults.standard.set(data, forKey: "profileImageOriginalKey")
UserDefaults.standard.synchronize()
profileImageView.image = originalImage.withRenderingMode(.alwaysOriginal)
}
dismiss(animated: true)
}
这是我在应用程序终止后获取数据时放置在 viewWillAppear 中的代码
private func fetchData() {
guard let data = data else { return }
guard let image = NSKeyedUnarchiver.unarchiveObject(with: data) as? UIImage else { return }
profileImageView.image = image.withRenderingMode(.alwaysOriginal)
print("fetch...")
}
在
userdefaults
中保存大数据不是一个好主意,通常不推荐,因为这不是保存图像的最有效方式;一种更有效的方法是将图像保存在应用程序的文档目录中。你使用Data
write
func 来做到这一点。 还有其他第三个库。如果你坚持使用
UserDefaults
保存图片
guard let imageData = editedImage.jpegData(compressionQuality: 0.5) else { return } UserDefaults.standard.set(imageData, forKey: "profileImageEditedKey") UserDefaults.standard.synchronize()
从
获取图像UserDefaults
guard let data = UserDefaults.standard.object(forKey: "profileImageOriginalKey") as? Data else { return; } let image = UIImage.init(data: data);