Skip to content

Compiled Repository

Seong-Ug Steve Jung edited this page Apr 22, 2016 · 3 revisions

복잡한 저장소는 1개의 표현식으로 만들 수 있다. 표현식은 아래의 순서로 진행된다.

  1. Repositories.repositoryWithInitialValue(…);
  2. 이벤트 시작점 - .observe(…);
  3. 응답횟수 - onUpdatesPer(…) 또는 .onUpdatesPerLoop();
  4. 데이터 흐름 - .getFrom(…), .mergeIn(…), .transform(…) 등등;
  5. 그외의 설정들 - .notifyIf(…), .onDeactivation(…) 등등;
  6. .compile()

생성된 저장소가 동작하면 내부의 Updatable 를 이벤트 시작점에게 등록하고 값을 처리하기 위해 데이터 흐름이 시작된다. 이 흐름은 이벤트를 전달받은 곳에서 처리 과정에서 값을 갱신하기 위해 다시 반복된다. 첫 처리가 끝나기 전에는 저장소는 정의된 초기값을 줄 것입니다. 저장소는 값이 변경될때마다 Client 에게 알려줄 것입니다. 저장소가 비활성화가 되면 내부 Updatable 들은 이벤트 시작점에게 등록을 해제하고 데이터 흐름도 동작하지 않을 것이며 외부로 전달된 값은 더이상 변경되지 않습니다. On reactivation the value 는 1번 이상은 갱신 될 것입니다.

표현식의 단계가 달라질때는 RepositoryCompilerStates 에 있는 “compiler state interface 에 의해 표현될 것입니다. 각 단계에서는 적합한 함수만 노출 되도록 올바른 표현식이 완성될 수 있도록 가이드 될 것입니다. (IDE 자동환성을 이용할 때) 메소드의 문서에서 이 인터페이스들을 찾을 수 있습니다.

  • 이벤트 시작점과 반응 시점 : RFrequency 와 부모 인터페이스 `REventSource
  • 데이터 처리 흐름 : RFlow 와 부모 인터페이스 RSyncFlow
  • 기타 설정 : RConfig

저장소를 만들때 표현식은 중간에 변수획득, 타입캐스팅을 목적으로 끊겨서는 안됩니다. 일부는 아예 지원하지 않습니다.

저장소 만들기가 오버헤드를 야기할 수도 있지만 그 후 동작시에는 정말 가볍게 동작합니다. 어떤 저장소는 Activity 나 재사용을 위한 View 구조, 심지어는 Application 에 종속된 라이프사이클을 가진 객체들과 같은 고수준의 컴포넌트에도 적합합니다. 물론 이게 컴파일 과정에서 오버헤드를 발생할지도 모른다

When, Where, What

저장소 생성 표현에서 When 은 저장소가 이벤트 시작점으로 반응할때이고, Where 은 반응이 발생하는 곳이며 What 은 전달될 데이터로 구성된다.

생성된 저장소는 제시된 빈도에 제시된 이벤트 시작점을 관찰한다. 이 두가지 표현이 생성된 저장소의 When 요소를 결정짓는다.

데이터 처리 흐름에서 데이터 원형과 저장소 데이터의 계산을 정의한다. 이것이 What 요소이다.

Looper Thread 에서 이벤트 시작점으로 등록해야만 하는 내부 Updatable 의 사용때문에 생성된 저장소는 Worker Looper 도 구성된다. 데이터 처리 흐름 과정에서 자바 쓰레드 생성자로 처리를 옮겨지기 위해 Directive 들은 삽입될 수 있다. 이런 명시적 쓰레드 생성은 저장소의 Where 요소를 결정짓는다.

Data processing flow

데이터 처리 흐름은 Directive 들로 구성된다. 각각의 Directive 는 입력된 값을 받아들인 다음 Directive 로 가공된 값을 전달한다. 첫 Directive 의 입력 값 타입은은 저장소 값 타입이며 마지막 Directive 의 가공 타입이기도 하다. - one that starts with then. 컴파일러 상태 인터페이스는 가능한 Generic 타입을 사용하여 입력자 타입의 반공변성, 출력값의 공변성과 Type Safety를 보장하도록 한다. (역자: 반공변성, 공변성)