Сохраняйте транзакции NSUndoManager по одной

Мне нужно сохранить изменения не только локально в Core Data, но на сервере тоже.

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

Мой новый подход заключается в том, чтобы позволить пользователю делать много взаимодействий и размещать транзакции на undo stack предоставлено NSUndoManagerвключен NSManagedObjectContext, НО сохранять / фиксировать ТОЛЬКО ту транзакцию, для которой было получено сообщение об успехе. Как я могу перемещать отмену "курсора" по одному, фиксировать записи одну за другой, хотя контекст уже содержит множество несохраненных изменений?

1 ответ

Решение

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

Что я делал в прошлом, так это создавал свою очередь исходящих изменений. Всякий раз, когда изменения сохраняются локально, добавьте эти изменения в список несинхронизированных исходящих изменений. Затем используйте другую очередь для обработки этой очереди, отправляя их на сервер и, если сервер сообщает об успешном выполнении, удаляя эти изменения. Ты можешь использовать NSManagedObjectContextWillSaveNotification и / или NSManagedObjectContextDidSaveNotification отслеживать изменения и обновлять исходящую очередь.

Это означает, что устройство iOS может иметь в очереди изменения, о которых сервер не знает, особенно если сеть ненадежна или недоступна. Это в значительной степени неизбежно в этих ситуациях, если только вы не делаете что-то ужасное, например, отказываетесь позволить людям вносить новые изменения, пока сеть не восстановится.

Другие вопросы по тегам