MutableSharedFlow — разница между replay и extraBufferCapacity

MutableSharedFlow принимает 3 параметра: replay, extraBufferCapacity и onBufferOverflow. В чем разница между replay и extraBufferCapacity?

В документации упоминается следующее:

replay - количество значений, воспроизводимых новым подписчикам (не может быть отрицательным, по умолчанию равно нулю).

extraBufferCapacity — количество буферизуемых значений в дополнение к воспроизведению. emit не приостанавливается, пока остается свободное место в буфере (необязательно, не может быть отрицательным, по умолчанию равно нулю).

Я не совсем понимаю разницу между 2 и когда нам понадобится extraBufferCapacity > 0. Является ли extraBufferCapacity просто дополнительной емкостью воспроизведения для эмиттеров?

1 ответ

Является ли extraBufferCapacity просто дополнительной возможностью воспроизведения для эмиттеров?

Терминология «воспроизведения» действительно имеет смысл только для подписчиков, а не для эмитентов. replayПараметр определяет, сколько прошлых значений получат новые подписчики при подписке. Это, очевидно, подразумевает, что эти значения должны быть сохранены, поэтому общий буфер должен быть как минимум таким большим.

Однако размер буфера в целом влияет на эмиттеры. Точные последствия полного буфера зависят от onBufferOverflow, но этот размер буфера можно использовать для контроля обратного давления на эмиттеры (замедляя их работу) или для того, чтобы отбрасывать сообщения. С большим буфером вы можете позволить эмиттерам иметь всплески эмиссии, не замедляя их, как любой обычный буфер.

Теперь выбор буфера большего размера не должен заставлять вас воспроизводить эти буферизованные значения новым подписчикам, поэтому extraBufferCapacity. С extraBufferCapacity > 0, вы можете определить буфер любого желаемого размера, не заставляя вас воспроизводить как можно больше значений, просто используя формулу:

      bufferSize = replay + extraBufferCapacity

Например, вы можете решить вообще не воспроизводить значения для новых подписчиков, но по-прежнему разрешать всплески от эмиттеров, имея некоторый (не воспроизводимый) буфер.

Другие вопросы по тегам