Первоначальная синхронизация и дублирование объектов с одним и тем же первичным ключом внутри 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;
 }
)

person Evgen Bodunov    schedule 16.01.2017    source источник


Ответы (1)


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

person Dmitry    schedule 16.01.2017
comment
Есть ли способ определить, что первая синхронизация завершена? Я бы предпочел не загружать данные, а затем исправлять дубликаты, а получать данные, удалять дубликаты и загружать правильную версию данных. - person Evgen Bodunov; 16.01.2017
comment
В настоящее время нет, но мы над этим работаем. Вы можете отслеживать прогресс на github.com/realm/realm-cocoa/pull/4535 < / а> - person Dmitry; 16.01.2017