онлайн / оффлайн управление данными

Мне нужно создать приложение, функциональность которого аналогична приложению контактов. Вы можете добавить контакт на iPhone клиента, и он должен быть загружен на iPad клиента. Если клиент обновляет контакт на своем iPad, он должен обновляться на своем iPhone.

1111 Большая часть этого довольно прямолинейна. Я использую Parse.com в качестве моего бэкенда и сохраняю контакты локально с помощью Core Data. Единственная проблема, с которой я сталкиваюсь - это управление контактами, когда пользователь не в сети.

1112 Допустим, у меня есть iPhone и iPad. Оба они в настоящее время имеют одну и ту же версию онлайн-базы данных. Мой iPhone сейчас не в сети. Сейчас 9 утра.

В 10:00 я обновляю номер телефона для контакта на моем iPad. Сохраняет изменения локально и онлайн. В 11 утра я обновляю адрес электронной почты для того же контакта на моем iPhone, но я все еще не в сети.

В полдень мой iPhone подключается к Интернету и проверяет сервер на наличие изменений. Он видит, что его изменения более поздние, чем последнее обновление (проверка свойства метки времени updatedAt), поэтому вместо загрузки нового телефонного номера для контакта (который является «устаревшим»), он переопределяет номер телефона вместе с адресом электронной почты. адрес (обновляет новый телефонный номер до его старой версии, поскольку он был отключен во время обновления телефонного номера в 10:00, и его изменения предположительно более поздние).

Как я должен справляться с онлайн / офлайн проблемами, такими как описанная выше? Решение, которое я могу придумать, состоит в том, чтобы сохранять обновленные метки времени для каждого атрибута контакта, а не просто общее свойство updatedAt для всего контакта, например когда было обновлено первое имя, когда была обновлена ​​фамилия, а затем вручную проверьте, есть ли в автономном устройстве более свежие изменения по каждому атрибуту, вместо перезаписи всего объекта, но это выглядит неаккуратно.

Я также думал о том, чтобы иметь свойство метки времени updatedLocally и updatedOnline для каждого объекта Core Data. Таким образом, если эти два значения не совпадают, я могу выполнить проверку различий и использовать самый последний для конфликтов, но это все еще не кажется самым чистым решением. Кто-нибудь еще сталкивался с чем-то подобным? Если да, то как вы решили это?

Псевдокод / ​​Резюме того, что я думаю? охватывает каждый тестовый пример, но все еще не очень элегантно / завершено:

2 Объекты на Parse.com: История контактов и контактов

У контакта есть первый, последний, телефон, электронная почта, онлайн Обновление

История контактов имеет первичный ключ для контакта, к которому можно обратиться и те же атрибуты, но с историей. например first: [{value:"josue",onlineUpdate:"9AM"},{value:"j",onlineUpdate:"10AM"},{value:"JOSUEESP",onlineUpdate:"11AM"}]

1 Объект на базовых данных, контакт:

Контакт имеет первый, последний телефон, электронную почту, onlineUpdate и offlineUpdate (ВАЖНО: это только для базовых данных, а не для Parse)

for every contact in parse database as onlineContact {
    if onlineContact does not exist in core data {
        create contact in core data
    }
    else {
        // found matching local object to online object, check for changes
        var localContact = core data contact with same UID as onlineContact
        if localContact.offlineUpdate more recent than onlineContact.onlineUpdate {
            for every attribute in localContact as attribute {
                var lastOnlineValueReceived = Parse database Contact History at the time localContact.onlineUpdate for attribute
                if lastOnlineValueReceived == localContact.attribute {
                    // this attribute did not change in the offline update. use latest available online value
                    localContact.attribute = onlineContact.attribute
                }
                else{
                    // this attribute changed during the more recent offline update, update it online
                    onlineContact.attribute = localContact.attribute
                }
            }
        }
        else if onlineContact.onlineUpdate more recent than localContact.offlineUpdate {
            // another device updated the contact. use the online contact.
            localContact = offlineContact
        }
        else{
            // when a device is connected to the internet, and it saves a contact
            // the offline/online update times are the same
            // therefore contacts should be equivalent in this else statement
            // do nothing
        }
}

TL; DR: Как вы должны структурировать некую систему контроля версий для онлайн / автономных обновлений без случайной перезаписи? Я хотел бы ограничить использование полосы пропускания до минимума.

10
задан Josue Espinosa 1 July 2015 в 17:31
поделиться