Сохранять приложение при прекращении использования UserDefaults - PullRequest
0 голосов
/ 01 января 2019

Я хочу сохранить изображение, используя 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...")
}

1 Ответ

0 голосов
/ 01 января 2019
  1. Не рекомендуется сохранять большие данные в userdefaults, часто это не рекомендуется, так как это не самый эффективный способ сохранения изображений;более эффективный способ - сохранить изображение в каталоге документов приложения.вы используете Data write func для этого.есть и другие третьи библиотеки.

  2. , если вы настаиваете на использовании 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);
    
...