Я разрабатываю приложение на основе местоположения. Чтобы получить данные из API, мне нужны две вещи: позиция и, конечно же, подключение к Интернету.
При запуске приложения я хочу попытаться получить GPS-позицию пользователя. Если это невозможно, пользователю должно быть предложено ввести город или адрес в модальном диалоговом окне. После того, как позиция GPS получена или пользователь ввел позицию вручную, широта и долгота сохраняются в хранилище избыточности.
Пока в магазине нет широты и долготы, я не могу получить какие-либо данные из API, потому что они основаны на местоположении пользователей.
Итак, я вижу несколько задач, которые необходимо выполнить при запуске:
- Попробуйте получить GPS-позицию
- Скрыть заставку
- Если GPS-позиция недоступна, должно появиться модальное окно для входа в город.
- Получение данных из API (требуется GPS-позиция и интернет)
- Показать сообщение, что нет подключения к интернету
Я попытался поместить эти вещи в блок-схему, не принимая во внимание UML или стандарты. Может быть, это поможет понять, что я пытаюсь архивировать.
Вопрос
1) Когда я должен инициировать получение данных? После запуска вы можете использовать кнопку Pull-To-Refresh или кнопку Retry для повторной загрузки. Но где это должно срабатывать при запуске? В ListContainer componentWillMount
?
2) Как ждать с получением, пока есть позиция и подключение к интернету? редукс-сага?
Мой текущий подход использует redux-saga, но я не знаю, правильный ли это способ решить эту проблему...
Чтобы использовать redux-saga, я немного изменил свои действия, чтобы теперь их было три, для соответствующих действий саги: GPS_POSITION_RECEIVED
, SET_POSITION
(при установке позиции в LocationModal) и INTERNET_AVAILABLE
. Проблема в том, что я не могу ждать/предпринимать все действия, потому что GPS_POSITION_RECEIVED и SET_POSITION никогда не произойдут одновременно. GPS может быть получен навигатором или пользователь выбирает его самостоятельно.
import { take, put, call, fork, select, all } from 'redux-saga/effects'
export function* init() {
try {
// Wait for the position
console.log('Start init...');
console.log('Wait for position and internet...')
const posAndInet = yield take(['GPS_POSITION_RECEIVED', 'INTERNET_AVAILABLE']);
console.log('Position and internet ready...');
// Fetch data now
// ....
} catch (e) {
console.error(e);
}
}
export default function* rootSaga() {
yield[
fork(init),
];
}
И еще есть несколько функций, которые я запускаю в componenWillMount()
App-компонента. Может с Сагой или вообще есть места получше?
if(Platform.OS == 'android') StatusBar.setBackgroundColor('#000');
// Push Notifications
OneSignal.addEventListener('registered', () => {
// Track it to Google Analytics
this.props.registeredPushNotifications();
});
OneSignal.addEventListener('ids', (device) => {
// Save
this.props.receivedPlayerId(device.userId);
});
// Trigger watch position
this.props.watchPosition();
// Trigger internet connection oberservation
this.props.watchInternetConnection();
setTimeout(SplashScreen.hide, 1000);