Я пытаюсь включить синхронизацию на реальном времени на устройстве, которое уже содержит некоторые данные, которые уже сохраняются на сервере. Когда новый пользователь подключается к сфере, он должен объединять данные локального домена с данными синхронизации. Но этот код запускается до того, как произойдет первоначальная синхронизация. Поскольку данных с сервера еще не получено, приложение создает некоторые записи в синхронной области. Когда синхронизация завершается, я вижу те же данные дважды. Записи, которые я только что создал, и данные, полученные с сервера. С таким же первичным ключом.Исходные объекты синхронизации с одним и тем же основным ключом внутри 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;
}
)
Есть ли способ обнаружить, что первая синхронизация завершена? Я бы предпочел не загружать данные, а затем исправлять дубликаты, но извлекать данные, удалять дубликаты и загружать правильную версию данных. –
В настоящее время нет, но это то, над чем мы работаем. Вы можете отслеживать прогресс на странице https://github.com/realm/realm-cocoa/pull/4535 – Dmitry