Сохраняйте транзакции NSUndoManager по одной
Мне нужно сохранить изменения не только локально в Core Data
, но на сервере тоже.
Мое беспокойство в том, что в моем случае пользователь может сделать кучу взаимодействий за короткое время. Между взаимодействиями не хватает времени, чтобы получить сообщение об успешном возвращении с сервера. Так что либо я блокирую графический интерфейс, пока не вернется следующее сообщение (сейчас это так), либо выберу другой подход.
Мой новый подход заключается в том, чтобы позволить пользователю делать много взаимодействий и размещать транзакции на undo stack
предоставлено NSUndoManager
включен NSManagedObjectContext
, НО сохранять / фиксировать ТОЛЬКО ту транзакцию, для которой было получено сообщение об успехе. Как я могу перемещать отмену "курсора" по одному, фиксировать записи одну за другой, хотя контекст уже содержит множество несохраненных изменений?
1 ответ
NSUndoManager
не очень подходит для этой задачи. Вы можете сказать это отменить или повторить действия, но вы не можете проверить эти действия или выборочно сохранить данные в текущем стеке отмены.
Что я делал в прошлом, так это создавал свою очередь исходящих изменений. Всякий раз, когда изменения сохраняются локально, добавьте эти изменения в список несинхронизированных исходящих изменений. Затем используйте другую очередь для обработки этой очереди, отправляя их на сервер и, если сервер сообщает об успешном выполнении, удаляя эти изменения. Ты можешь использовать NSManagedObjectContextWillSaveNotification
и / или NSManagedObjectContextDidSaveNotification
отслеживать изменения и обновлять исходящую очередь.
Это означает, что устройство iOS может иметь в очереди изменения, о которых сервер не знает, особенно если сеть ненадежна или недоступна. Это в значительной степени неизбежно в этих ситуациях, если только вы не делаете что-то ужасное, например, отказываетесь позволить людям вносить новые изменения, пока сеть не восстановится.