Вероятно, этому есть хорошее объяснение, но на данный момент я очень озадачен.
Так что в данном случае я хочу отправить избыточное действие либо в блоке setTimeout
, либо вAlert.alert
обратный вызов в RN.Что я замечаю, так это то, что если код выполняется таким образом, то он намного медленнее.
Например, код ниже:
import React from 'react';
import { connect } from 'react-redux';
import { addTag } from '../redux/actions';
import { Button, View, Alert } from 'react-native';
export const HomePerfTest = connect(
null,
dispatch => ({
addTag: (tag, category) => dispatch(addTag(tag, category)),
})
)(props => (
<View>
<Button
title="Press me"
onPress={() => {
addRandomTags(props.addTag);
}}
/>
<Button
title="Press me"
onPress={() => {
Alert.alert('Add random tags', null, [
{
text: 'Yes',
onPress: () => {
addRandomTags(props.addTag);
},
},
{
text: 'No',
},
]);
}}
/>
</View>
));
const addRandomTags = addTag => {
for (let i = 0; i < 10; i++) {
measure(
() =>
addTag(
{
name: 'test' + i,
},
'test'
),
'addTag'
);
}
};
const measure = (f, label) => {
var t0 = new Date().getTime();
const value = f();
var t1 = new Date().getTime();
console.log(label + ' took ' + (t1 - t0) + ' milliseconds.');
return value;
};
Теперь при нажатии 1-й кнопки addTag
работает за 0-1 миллисекунды.При нажатии второй кнопки (и затем нажатии «Да») это занимает 4–8 миллисекунд и, следовательно, в несколько раз медленнее.
Этот случай не так уж и плох, но я реализовал нечто подобное на другой странице моего приложения вкакая разница огромна.Требуется ~ 2 миллисекунды для нормальной работы и> 100 мс для выполнения, если он запускается из обратного вызова Alert
.
На данный момент я сделал обходной путь, используя другой модуль оповещения, в отличие от оповещения RN,Однако я заметил, что такое же поведение существует, если я просто оберну код в setTimeout
setTimeout(() => addRandomTags(props.addTag));
. Любое объяснение будет с благодарностью.
Обновление - Iможет видеть точно такую же задержку при переносе кода в requestAnimationFrame
.