У меня проблема с несколькими сферами в React Native. Я работаю над приложением, которое позволяет пользователям использовать приложение без подписки (с использованием локальной области), а затем в любой момент своего пути к приложению у них есть возможность перейти на подписку с синхронизацией (которая использует синхронизацию с сервер объектов области).
Когда я запускаю приложение, я проверяю, используют ли они синхронизацию, и если да, я инициализирую синхронизированную область с их пользователем, и все работает отлично. Я получаю все данные, которые ожидаю.
Однако, когда приложение запускается при первом запуске после установки (важна часть первого запуска после установки), и я вижу, что они не используют синхронизацию, я инициализирую локальную область, в которой сохраняю данные, пока они не решат войти в свою синхронизировать аккаунт (если он у них есть). На этом этапе я пытаюсь извлечь информацию из синхронизированной области, но у нее нет информации, которую я видел, когда я только инициализировал синхронизированную область (в случае, если при запуске приложения я обнаруживаю, что они используют синхронизацию).
Я могу войти в систему как пользователь синхронизации, но данных нет, если я ранее инициализировал локальную область, и эта логика запускается при первом запуске приложения после установки. Данные отображаются с сервера объектов области только тогда, когда я инициализирую локальную и синхронизированную область при вторичном запуске приложения (без переустановки перед запуском).
Вот простой тестовый сценарий с фиктивными данными, с помощью которого я смог воспроизвести наблюдаемое поведение:
const username = 'testuser2';
const password = 'supersecret';
const tld = 'REALM_OBJECT_SERVER_TLD';
class Test extends Realm.Object {}
Test.schema = {
name: 'Test',
properties: {
id: {
type: 'string',
},
}
};
function initLocalRealm() {
return new Realm({
path: 'local.realm',
schema: [Test],
});
}
function initSyncedRealmWithUser(user) {
return new Realm({
path: 'synced.realm',
sync: {
user,
url: `realm://${tld}:9080/~/data`,
},
schema: [Test],
});
}
function writeTestObjectWithId(realm, id) {
realm.write(() => {
realm.create('Test', {
id,
});
alert(`Test object with id: ${id}`);
});
}
initLocalRealm();
// setup
// uncomment this and comment out the login section to setup user on first run
// Realm.Sync.User.register(`http://${tld}:9080`, username, password, (error, user) => {
// if (error) {
// return;
// }
// const syncedRealm = initSyncedRealmWithUser(user);
// writeTestObjectWithId(syncedRealm, '1');
// });
// login
Realm.Sync.User.login(`http://${tld}:9080`, username, password, (error, user) => {
if (error) {
return;
}
const syncedRealm = initSyncedRealmWithUser(user);
alert(`Synced realm test objects: ${syncedRealm.objects('Test').length}`);
});
Если вы создадите собственное приложение для реагирования, а затем добавите этот код к функции componentDidMount
основных компонентов, вы должны увидеть, что при первом запуске приложения (после того, как вы один раз раскомментировали код регистра), вы увидите длину тестовой коллекции равной 0, но затем, когда вы обновите, вы увидите, что длина тестовой коллекции равна 1.
Любая помощь по этому поводу была бы потрясающей.
Спасибо!