Прослушиватели событий React Native iOS в реальном времени ⇐ IOS
Прослушиватели событий React Native iOS в реальном времени
Я использую response-native-firebase для аутентификации, базы данных реального времени и уведомлений, и у меня возникла ошибка с прослушивателями событий в реальном времени только на iOS, на Android все работает нормально.
Проблема возникает, когда я закрываю приложение и перезапускаю его. Когда я впервые устанавливаю приложение, прослушиватели работают, и я получаю обновления, но как только я перезапускаю приложение, прослушиватели больше не запускают обновления. Я подозреваю, что очистка не работает должным образом, когда я отключаю ссылку, особенно когда я закрываю приложение на экране, которое запускает прослушиватели.
Я пробовал отключить конкретный прослушиватель по типу события и все прослушиватели по ссылке, но ни один из них, похоже, не работает.
Я также считаю полезным отметить, что эта ошибка началась после того, как я внедрил облачный обмен сообщениями, до этого он работал нормально. Я также тестировал различные версии React-Native-Firebase, но ошибка всегда присутствовала.
Протестированные версии: 18.5.0, 18.4.0, 17.5.0 и 17.4.0.
Ниже приведена ловушка, которую я вызываю на экране сообщений.
export function PostListenerHook(challengeId: Number) { константная отправка = useAppDispatch(); использоватьFocusEffect( useCallback(() => { const now = moment.utc(new Date()).toDate(); константная база данныхRef = база данных().ref( `/updates/challenges/${challengeId}/mainposts`, ); const onPostUpdated = dataRef.on( 'child_changed', снимок => { пусть обновленныйPostId = snapshot.key; если (updatedPostId !== null) { пусть postRequest: PostRequest = { идентификатор вызова: идентификатор вызова, postId: Число (обновленныйPostId), }; отправка (checkShouldRefresh (postRequest)); } }, ошибка => console.log('ошибка:', ошибка), ); const onPostAdded = dataRef.on( 'child_added', снимок => { пусть обновленныйDatetimeUTC = snapshot.val()?.UpdatedDatetimeUTC ? moment.utc(snapshot.val()?.UpdatedDatetimeUTC).toDate() : неопределенный; if (updatedDatetimeUTC && isDateAfter(updatedDatetimeUTC, сейчас)) { пусть обновленныйPostId = snapshot.key; если (обновленныйПостид) { пусть postRequest: PostRequest = { идентификатор вызова: идентификатор вызова, postId: Число (обновленныйPostId!), }; отправка (getNewPostByIdThunk (postRequest)); } } }, ошибка => console.log('ошибка:', ошибка), ); // Прекращаем прослушивание обновлений, когда они больше не нужны возврат () => { console.log('child_changed clenup'); dataRef.off('child_changed', onPostUpdated); console.log('child_added clenup: '); dataRef.off('child_added', onPostAdded); // Также проверяется по типу события dataRef.off('child_changed'); dataRef.off('child_added'); // А также протестировано на удаление всех прослушивателей по этой ссылке база данныхRef.off(); }; }, [идентификатор вызова, отправка]), ); }
Я использую response-native-firebase для аутентификации, базы данных реального времени и уведомлений, и у меня возникла ошибка с прослушивателями событий в реальном времени только на iOS, на Android все работает нормально.
Проблема возникает, когда я закрываю приложение и перезапускаю его. Когда я впервые устанавливаю приложение, прослушиватели работают, и я получаю обновления, но как только я перезапускаю приложение, прослушиватели больше не запускают обновления. Я подозреваю, что очистка не работает должным образом, когда я отключаю ссылку, особенно когда я закрываю приложение на экране, которое запускает прослушиватели.
Я пробовал отключить конкретный прослушиватель по типу события и все прослушиватели по ссылке, но ни один из них, похоже, не работает.
Я также считаю полезным отметить, что эта ошибка началась после того, как я внедрил облачный обмен сообщениями, до этого он работал нормально. Я также тестировал различные версии React-Native-Firebase, но ошибка всегда присутствовала.
Протестированные версии: 18.5.0, 18.4.0, 17.5.0 и 17.4.0.
Ниже приведена ловушка, которую я вызываю на экране сообщений.
export function PostListenerHook(challengeId: Number) { константная отправка = useAppDispatch(); использоватьFocusEffect( useCallback(() => { const now = moment.utc(new Date()).toDate(); константная база данныхRef = база данных().ref( `/updates/challenges/${challengeId}/mainposts`, ); const onPostUpdated = dataRef.on( 'child_changed', снимок => { пусть обновленныйPostId = snapshot.key; если (updatedPostId !== null) { пусть postRequest: PostRequest = { идентификатор вызова: идентификатор вызова, postId: Число (обновленныйPostId), }; отправка (checkShouldRefresh (postRequest)); } }, ошибка => console.log('ошибка:', ошибка), ); const onPostAdded = dataRef.on( 'child_added', снимок => { пусть обновленныйDatetimeUTC = snapshot.val()?.UpdatedDatetimeUTC ? moment.utc(snapshot.val()?.UpdatedDatetimeUTC).toDate() : неопределенный; if (updatedDatetimeUTC && isDateAfter(updatedDatetimeUTC, сейчас)) { пусть обновленныйPostId = snapshot.key; если (обновленныйПостид) { пусть postRequest: PostRequest = { идентификатор вызова: идентификатор вызова, postId: Число (обновленныйPostId!), }; отправка (getNewPostByIdThunk (postRequest)); } } }, ошибка => console.log('ошибка:', ошибка), ); // Прекращаем прослушивание обновлений, когда они больше не нужны возврат () => { console.log('child_changed clenup'); dataRef.off('child_changed', onPostUpdated); console.log('child_added clenup: '); dataRef.off('child_added', onPostAdded); // Также проверяется по типу события dataRef.off('child_changed'); dataRef.off('child_added'); // А также протестировано на удаление всех прослушивателей по этой ссылке база данныхRef.off(); }; }, [идентификатор вызова, отправка]), ); }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение