2017-01-16 2 views
1

Я пытаюсь включить синхронизацию на реальном времени на устройстве, которое уже содержит некоторые данные, которые уже сохраняются на сервере. Когда новый пользователь подключается к сфере, он должен объединять данные локального домена с данными синхронизации. Но этот код запускается до того, как произойдет первоначальная синхронизация. Поскольку данных с сервера еще не получено, приложение создает некоторые записи в синхронной области. Когда синхронизация завершается, я вижу те же данные дважды. Записи, которые я только что создал, и данные, полученные с сервера. С таким же первичным ключом.Исходные объекты синхронизации с одним и тем же основным ключом внутри Realm Mobile Platform

См ниже код для примера:

RLMRealmConfiguration *config = [[RLMRealmConfiguration alloc] init]; 
config.syncConfiguration = [[RLMSyncConfiguration alloc] initWithUser:user realmURL:self.realmURL]; 
NSError *error = nil; 
RLMRealm *newRealm = [RLMRealm realmWithConfiguration:config error:&error]; 
if(newRealm != nil && error == nil) 
{ 
    [newRealm beginWriteTransaction]; 

    for(ModelFolder *folder in [ModelFolder allObjectsInRealm:curRealm]) 
    { 
     ModelFolder *newFolder = [ModelFolder objectInRealm:newRealm forPrimaryKey:folder.uuid]; 
     if(newFolder == nil) 
      [ModelFolder createInRealm:newRealm withValue:folder]; 
    } 

    [newRealm commitWriteTransaction]; 
} 

Есть ли способ, чтобы обнаружить, что область завершения первоначальной синхронизации?

UPD: Немногие подробности.

ModelFolder содержит @property RLMArray<ModelBookmark *><ModelBookmark> *bookmarks; И когда я создаю папку, это равно некоторой папке, которая будет извлечена через несколько секунд, и они слились бы правильно. Но. Закладки внутри объекта Folder не дедуплицированы и мы получаем что-то вроде этого:

RLMResults <0x802082d0> (
[0] ModelFolder { 
    uuid = 2615AB34-1C08-4E7B-8D49-6E02EDBCDF89; 
    name = (null); 
    descr = (null); 
    shareURL = (null); 
    date = 1484566331137; 
    bookmarks = RLMArray <0x806c78d0> (
    [0] ModelBookmark { 
    uuid = C752FCEB-65CB-47C8-8CF4-6CA44C119ECC; 
    name = (null); 
    descr = (null); 
    shareURL = (null); 
    date = 1484566331137; 
    folderUuid = 2615AB34-1C08-4E7B-8D49-6E02EDBCDF89; 
    longitude = 27.54834598813616; 
    latitude = 53.91333128839566; 
    mapZoom = 11.73785983313041; 
    category = 0; 
    visible = 1; 
    }, 
    [1] ModelBookmark { 
    uuid = C752FCEB-65CB-47C8-8CF4-6CA44C119ECC; 
    name = (null); 
    descr = (null); 
    shareURL = (null); 
    date = 1484566331137; 
    folderUuid = 2615AB34-1C08-4E7B-8D49-6E02EDBCDF89; 
    longitude = 27.54834598813616; 
    latitude = 53.91333128839566; 
    mapZoom = 11.73785983313041; 
    category = 0; 
    visible = 1; 
    } 
); 
    tracks = RLMArray <0x806fb120> (

); 
    opened = 1; 
} 
) 

ответ

1

К сожалению, слияние упорядоченных списков не поддерживается в настоящее время (пока https://github.com/realm/realm-core/issues/1206 не реализован). Пока вы должны вручную дедуплицировать элементы списка, вы можете использовать тот же обходной путь, который мы используем в приложении RealmTasks, см. https://github.com/realm/RealmTasks/pull/180 для деталей реализации.

+0

Есть ли способ обнаружить, что первая синхронизация завершена? Я бы предпочел не загружать данные, а затем исправлять дубликаты, но извлекать данные, удалять дубликаты и загружать правильную версию данных. –

+1

В настоящее время нет, но это то, над чем мы работаем. Вы можете отслеживать прогресс на странице https://github.com/realm/realm-cocoa/pull/4535 – Dmitry

Смежные вопросы