Как я могу записать все изменения в базу данных, как только пользователь подтвердит это? - PullRequest
0 голосов
/ 03 февраля 2020

Я создал меню, в котором пользователь может получить доступ к нескольким кнопкам, чтобы повернуть и изменить статус документа. Каждый раз, когда пользователь выбирает кнопку, изменения записываются в базу данных realm .


//changes the status of the dc
case "changeStatus" :
            if let marker = documentationMarkers.first(where: {$0.documentationId == doc.id}) {
                let nav = UINavigationController()
                let ctrl = StatusPickerViewController()
                ctrl.delegate = self
                nav.pushViewController(ctrl, animated: true)
                nav.modalPresentationStyle = .popover
                self.present(nav, animated: true)
                nav.popoverPresentationController?.permittedArrowDirections = .any
                nav.popoverPresentationController?.sourceView = marker
                nav.popoverPresentationController?.sourceRect = marker.bounds
            }

//rotates the document
case "rotateMarker" :
            if let marker = documentationMarkers.first(where: {$0.documentationId == doc.id}) {
                marker.rotate()
                let documentation = documentations.first(where: {$0.id == marker.documentationId})

                var rotation = documentation?.rotation.value ?? 0

                rotation = (rotation + 15) % 360

                _ = self.updateRotation(documentation: documentation!, rotationAngle: rotation)
            }

updateRotation метод находится в расширении хранилища и записывает изменения в БД:

func updateRotation(documentation: Documentation, rotationAngle: Int) throws {
        if let realm = try? Realm() {
            try realm.write {
                documentation.updated = Date()
                documentation.rotation.value = rotationAngle
            }

            return
        }

        throw MobiplanError.invalidStateError(message: "Opening the database failed")
    }

Моя кнопка подтверждения на данный момент пуста, потому что я не знал, как ее реализовать, чтобы изменения были зафиксированы в базе данных, когда ее и не каждый раз, когда выбирается другая кнопка.

Так, например, когда вы нажимаете кнопку вращения 100 раз, база данных изменяется 100 раз. Он должен изменить его только один раз при нажатии кнопки подтверждения.

Я думал о struct с обнуляемыми типами с вращением и статусом

struct DocumentationChanges {
    var statusId: String
    var rotation: Int
}

1 Ответ

0 голосов
/ 03 февраля 2020

Имейте в виду, что ваш текущий код ничего не записывает в вашу базу данных Realm, и ваша структура не имеет типа, допускающего обнуление.

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

Когда пользователь нажимает кнопку подтверждения, сохраняйте массив в своей базе данных Realm.

Как-то так сохранить ваши вращения:

var rotationStory = [DocumentationChanges]()
func updateRotation(documentation: Documentation, rotationAngle: Int) {
    let documentationChange = DocumentationChanges(statusId, rotationAngle)
    rotationStory.append(documentationChange)
}

И затем сохранить все выполненные вращения в базе данных после нажатия кнопки подтверждения:

func storeToRealm() {
    do {
        if let database = try? Realm()
        try database.write {
           database.add(rotationStory)
        }
    } catch {
        throw
    }
}
...