Низкая производительность при отправке избыточного действия изнутри setTimeout или обратного вызова Alert в RN - PullRequest
0 голосов
/ 28 декабря 2018

Вероятно, этому есть хорошее объяснение, но на данный момент я очень озадачен.

Так что в данном случае я хочу отправить избыточное действие либо в блоке 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...