LiveValue
구독자를 거느린 살아 있는 "현재 값": 늦게 온 구독자는 즉시 최신 값을 받고, 그 뒤의 모든 갱신을 이어 받습니다.
강의
평범한 Stream에는 기억이 없습니다: 늦게 구독하면 다음
이벤트가 올 때까지 아무것도 받지 못하고, 상태 — 현재 사용자, 현재
온도, 현재 줌 — 에서 이것은 새 화면마다 빈 채로 시작한다는 뜻이
됩니다. LiveValue<T>는 이벤트 소스로 구현한
상태입니다: 현재 값을 보관하고, add가 값을 갱신하며
구독자에게 알리고, 모든 늦은 구독자는 최신 값을 먼저
재생받은 다음 라이브 갱신에 올라탑니다. 공백도, 빈 시작도,
"다음 틱을 기다리세요"도 없습니다.
API는 의도적으로 작습니다. 빈 채로(LiveValue()) 또는
시드와 함께(LiveValue.seeded(value)) 생성합니다.
.value로 동기적으로 읽는데 — 아무것도 설정된 적이
없으면 StateError를 던지니 .hasValue를
확인하거나 시드를 주세요. 상태인 척하는 조용한 null은
없습니다. 구독은 .live를 통해 하는데 이것은
FxEvents 체인이고(map하고,
debounce하고, 결합할 수 있습니다), 같은 피드의 평범한 Stream 뷰가
필요하면 .stream입니다.
close()는 피드를 끝냅니다: 구독자들의 스트림이 닫히고,
이후의 add는 던집니다 — 다만 닫힌
LiveValue도 늦은 구독자에게는 마지막 값을 재생해 준
뒤에 그 스트림을 닫습니다. Rx를 아신다면, 이것은
BehaviorSubject를 그 본질적 동작만 남기고 줄인
것입니다. fxdart 이벤트 계층이며, FxTS의 일부가 아닙니다.
데모 1 · 늦은 구독자는 최신 값에서 시작한다
데모 2 · value, hasValue, 그리고 close
메서드 표기
Stream에서 두 생성자를 멤버로 부를 수 있습니다.
source.fxLive는 LiveValue.from(source)이고,
source.fxLiveSeeded(v)는
LiveValue.seededFrom(v, source)입니다. 둘 다 여전히 hot이라
구독이 즉시 열립니다.
final price = ticker.fxLive;
final count = taps.fxLiveSeeded(0); // has a value before the first tap
직접 해 보기
연습: 라이브 상태로부터 레이블 피드 파생하기.
fxEvents — .live는 이 체인을 그대로 말함 ·
combineLatest — 두 라이브 피드로부터 상태 파생하기 ·
Stream 다리 — 피드를 pull 세계로 옮기기