이전에 Layout, ReusableComposeNode를 통해 새로운 노드를 삽입하는 것이 composer에게 위임된다는 것을 보았다. 이는 Composer가 composition에 새로운 노드를 삽입하는 과정에 참여하고 있을 때, Compose는 해당 사실을 항상 알고 있다는 것을 의미한다. 이런 경우에는 Composer가 변경 사항이 방출될 때 Change List에 추가하는 대신 곧바로 슬롯 테이블에 변경 사항을 작성할 수 있다. 그 외의 경우에는 변경 사항들이 Change List에 기록되고 지연된다.
Composition이 완료되면 composition.applyChanges()가 호출되어 트리를 구체화하고 변경사항이 슬롯 테이블에 기록된다. Composer는 데이터, 노드, 그룹 등 다양한 유형의 정보를 작성할 수 있다. 이들을 모두 공통된 “group” 단위로 SlotTable에 기록하고, 각 group의 key, flags, slot 범위, node 유무 같은 필드값으로 그 group의 역할을 구분한다.
Composer는 모든 그룹을 “시작”하고 “종료”할 수 있다. 쓰고 있는 경우에는 슬롯테이블에서 “그룹 생성” 및 “그룹 제거”를 의미하고 읽고 있는 경우 SlotReader는 읽기를 시작하거나 종료하기 위해 읽기 포인터를 그룹 외부로 이동하라는 요청을 받는다.
Composable 트리의 노드는 삽입뿐만 아니라 제거되거나 이동될 수 있다. 이를 위해 Composer는 SlotReader를 적절하게 재배치하고 해당 그룹을 건너뛰게 하며, 해당 그룹의 모든 노드를 Applier에서 제거하는 작업을 수행한다. 모든 수정 작업은 일괄적으로 적용되기 위해 예약(기록)되어야 한다. 모든 변경사항이 동시에 다 같이 반영되어야 의미있기 때문이다. Composer는 더 이상 아무 데이터도 방출하지 않을 제거된 그룹에 대한 모든 보류 중인 invalidation을 폐기한다.
Composer가 그룹을 시작하려고 할 때 다음과 같은 일들이 발생한다.
<aside> 💡
즉, startGroup()은 단순 시작이 아니라 이 그룹을 새로 만들지, 재사용할지, 이동할지, 읽기만 할지 결정하는 분기 지점이다.
</aside>
마지막 composition으로부터 정상적으로 값이 변경되었는지 확인하는 비교는 remember 함수가 호출되는 즉시 수행되지만, 업데이트 작업은 Composer가 값을 이미 삽입하는 중이 아니라면 Change로 기록된다.
업데이트할 값이 RememberObserver인 경우 Composer는 composition의 기억 작업을 추적하기 위해 암시적 Change도 기록한다. 이는 나중에 기억하고 있는 모든 값을 다시 잊어야 할 때 사용하기 위함이다.