Switt - изображение сохраняется в Core Data еще до того, как managedObjectContext.save () будет объявлено - PullRequest
0 голосов
/ 01 ноября 2019

В настоящее время у меня есть приложение, которое отображает текст и изображения в контроллере TableView , где он считывает основные данные.

Мое приложение выполняет следующие действия (шаг за шагом):

  • Нажата кнопка, чтобы открыть библиотеку фотографий

  • Выбирает изображение из библиотеки фотографий

  • Как толькопосле выбора фотографии появляется UIAlert с двумя текстовыми полями, в которые вводится текст, а также с двумя кнопками Отмена и Сохранить .

  • Вводится текст, который сохраняется в базе данных, а также изображение.

Все отлично работает, отправляется и хорошо отображается в TableViewCell с изображением и текстами, но изображение уже отправляется еще до объявления managedObjectContext.save()

Я заметил, что это проблема, потому что, когда я выбираю фотографию из средства выбора фотографий, но нажимаю Отмена при появлении запроса на ввод текста в текстеполя, изображение отправляется в базу данных, даже если не нажать кнопку Сохранить в UIView , которая содержит только объявление managedObjectContext.save().

Я загрузилвидео-демонстрация на YouTube для более подробного объяснения этой проблемы: https://www.youtube.com/watch?v=E6aBOwkgwsM

Вот несколько моих идей для решения этой проблемы, но я не знаю с чего начать:

  • Помощь в структурировании кода, вызывающего эту проблему

  • При нажатии Отмена удалите последнюю запись в Базовых данных, так как изображение передается только взапись а не тексты.

Примечание. В настоящее время каждый атрибут отмечен как необязательный.

Код ниже:

func create (with image:UIImage){
    let object = Entity(context: managedObjectContext)
    object.image = NSData(data: image.jpegData(compressionQuality: 0.3)!) as Data

    let inputAlert = UIAlertController(title: "Title", message: "Enter texts", preferredStyle: .alert)
    inputAlert.addTextField { (textfield:UITextField) in
        textfield.placeholder = "Textfield 1"
    }
    inputAlert.addTextField { (textfield:UITextField) in
        textfield.placeholder = "Textfield 2"
    }

    let save = UIAlertAction (title: "Save", style: .default, handler: { (action:UIAlertAction) in

        let firstTextField = inputAlert.textFields?.first
        let secondTextField = inputAlert.textFields?.last

        if firstTextField?.text != "" && secondTextField?.text != "" {
            object.firstAttribute = firstTextField?.text
            object.secondAttribute = secondTextField?.text

            do{
                try self.managedObjectContext.save()
                self.loadData()
            }
            catch{
                let alert = UIAlertController(title: "Cannot Save", message: "Error saving", preferredStyle: UIAlertController.Style.alert)

                let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel) {
                    UIAlertAction in
                    alert.removeFromParent()
                }
                alert.addAction(okAction)

                self.present(alert, animated: true, completion: nil)

                print("Could not save data \(error.localizedDescription)")
            }
        }

    })

    let cancel = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel) {
        UIAlertAction in
        self.loadData()
    }

    inputAlert.addAction(save)
    inputAlert.addAction(cancel)


    if self.presentedViewController == nil {
        self.present(inputAlert, animated: true, completion: nil)
    }
    else {
        self.dismiss(animated: false, completion: nil)
        self.present(inputAlert, animated: true, completion: nil)
    }
}
...