Несколько областей в React Native неправильно запрашивают сервер объектов области при первом запуске приложения после установки

У меня проблема с несколькими сферами в 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.

Любая помощь по этому поводу была бы потрясающей.

Спасибо!


person jasonmerino    schedule 02.03.2017    source источник
comment
Для ясности: у вас есть два Realms с данными, одно синхронизированное и одно локальное. Когда вы открываете только локальный, у вас есть данные. Когда вы открываете только синхронизированный, у вас есть данные. Когда вы открываете оба, у вас есть данные только в локальном, а синхронизированная область пуста?   -  person teotwaki    schedule 03.03.2017
comment
Верный. Единственные случаи, которые у меня есть до сих пор, - это только локальная область с данными в ней (которая работает, как ожидалось), наличие только синхронизированной области с данными в ней (которая также работает, как ожидалось), а затем наличие локальной области, которая является сначала инициализируется, а затем синхронизированная область, которая инициализируется второй, и когда я это делаю, синхронизированная область никогда не получает данные с сервера объекта области, но локальная область все еще имеет свои данные. Я еще не пробовал другой способ (сначала инициализация синхронизировалась, а затем локально), но у меня есть подозрение, что обе области также не получат данные.   -  person jasonmerino    schedule 03.03.2017
comment
Не могли бы вы дополнить свой вопрос информацией о том, как вы проверяете, что синхронизированная область никогда не получает данные? Спасибо.   -  person teotwaki    schedule 03.03.2017
comment
@teotwaki Я сузил его и добавил обновленный фрагмент кода, с помощью которого вы сможете воспроизвести проблему, которую я вижу. Кажется, что я не получаю данные обратно с сервера объекта области при инициализации локальной, а затем синхронизированной области ТОЛЬКО при первом запуске после установки приложения. Если я просто обновлю приложение, я верну данные с сервера объекта области даже при инициализации локальной, а затем синхронизированной области.   -  person jasonmerino    schedule 09.03.2017
comment
Привет @teotwaki. Мне было любопытно, имел ли кто-нибудь из команды realm-js возможность разобраться в этом. Есть обновления?   -  person jasonmerino    schedule 15.03.2017
comment
Извини за это. Я попрошу кого-нибудь посмотреть на это завтра.   -  person teotwaki    schedule 15.03.2017
comment
Не стоит беспокоиться. :) Спасибо за обновления!   -  person jasonmerino    schedule 15.03.2017


Ответы (1)


запустив ваш фрагмент кода, я сразу же получаю длину 1, как только раскомментирую раздел входа в систему. Не могли бы вы попробовать наблюдать за синхронизированной областью с помощью Realm Browser и посмотрите, есть ли у него те данные, которых вы ожидаете после регистрации пользователя?

person Kristian Dupont    schedule 15.03.2017
comment
Когда я вытащил путь тестового пользователя в Realm Browser, я действительно вижу данные. Возможно, я прямо не сказал выше, что приложение React Native необходимо перестроить после запуска кода для регистрации пользователя, чтобы увидеть его поведение. Кроме того, я использую react-native 0.33.1 и realm 1.0.1 (я вижу, что вышли новые версии, я попробую самую новую, когда у меня будет время). Кроме того, наша текущая версия сервера объектов - 1.0.2. - person jasonmerino; 15.03.2017
comment
Я только что протестировал модуль Realm NPM версии 1.1.1 и обнаружил ту же проблему. Вероятно, стоит отметить, что для того, чтобы увидеть такое поведение, мне нужно полностью удалить приложение из симулятора iOS. Если я просто перезапущу приложение или даже остановлю его в XCode, а затем повторно запустил его, я получаю правильное количество объектов, возвращающихся с сервера объектов. - person jasonmerino; 15.03.2017
comment
Ах, в этом случае вы, вероятно, просто спрашиваете, прежде чем он будет полностью синхронизирован. У нас есть проблема с уведомлением о ходе выполнения, которая еще не реализована. Попробуйте добавить небольшую задержку перед проверкой. - person Kristian Dupont; 15.03.2017
comment
Хорошо, думаю, я нашел решение. Сразу после инициализации моей синхронизированной области я добавил к ней группу слушателей, а затем попытался вручную вытащить из нее данные для начальной популяции моего хранилища redux. Это сделано для того, чтобы я был уверен, что получу данные, когда он будет разрешен. Кажется, сейчас он работает хорошо. - person jasonmerino; 16.03.2017