2017-01-22 6 views
1

자동 저장 기능을 구현하고 싶습니다.C에서 RX로 자동 저장

  • IObservable<Unit> changes : 나는 두 Observable 인이하는 항목을 사용자가 텍스트
  • IObservable<Unit> saves을 편집 할 때마다 방출 : 방출하는 이벤트를 내가 결합하려는 저장 버튼 지금

을 누를 때마다 시간을 절약 제 3의 스트림에 들어가는 사람 writeBack. 이 스트림에는 현재 텍스트를 데이터베이스에 쓰는 구독자가 있습니다.

어떻게 writeBack 스트림을 만들면 다음과 같은 속성이 채워지나요? 삼초 (같은 스로틀)

  • 이벤트에 저장을 위해 변경 발생이를 havent 경우 저장되지 않은 변경, 다시 기록됩니다

    • 마지막 저장되지 않은 변경 사항을 즉시 다시

    I를 기록 에만 저장하지 않은 변경 사항을 저장하고 싶습니다. 나는 경우 텍스트를 저장할 해달라고 :

    • 가 저장 이벤트가 있지만 변경 사항 없음
    • 행의 이벤트 저장
    • 이 있지만, 변화 사이의 저장 이벤트가
    • 중간에 변경 및 해당 자동 저장

    답변

    0

    이 작업을 수행해야합니다. 각각의 사이에 적어도 하나의 편집, 저장 및 첫 올 수없는 저장 :

    var saveTriggers = changes.Throttle(TimeSpan.FromSeconds(3)) 
        .Merge(saves); 
    

    다음 우리는 그들이 당신의 논리를 충족하는지 확인하기 위해 사람들을 필터링 : 처음에 우리는 우리가 저장할 수 있습니다 시간을 확인합니다. SkipWhile은 변경 사항 이전의 저장이 무시되는지 확인하기위한 것입니다. Scan은 각 저장 사이의 변경 수를 계산합니다. 이 번호가 0이 될 때만주의합니다 (저장이 트리거되었음을 나타냄). DistinctUntilChanged은 연속 저장을 필터링합니다.

    var actualSaves = saveTriggers.Select(_ => EventType.SaveTrigger) 
        .Merge(changes.Select(_ => EventType.Edit)) 
        .SkipWhile(et => et == EventType.SaveTrigger) 
        .Scan(0, (editCount, eventType) => eventType == EventType.SaveTrigger ? 0 : editCount + 1) 
        .DistinctUntilChanged() 
        .Where(count => count == 0) 
        .Select(_ => Unit.Default); 
    

    enum EventType 
    { 
        SaveTrigger, 
        Edit 
    } 
    
    +0

    감사 열거 클래스를 사용하여, 정확히 무엇을해야한다. 내 솔루션을 찾았지만 지연된 스트림이있는 Windows를 사용하고 복잡한 방법이었습니다. 이 방법이 훨씬 쉽습니다. 스캔을 사용하는 것이 좋습니다. – Streamfighter

    +0

    감사합니다. 역사의 관점에서 논리를 볼 때마다 언제나 '스캔 (Scan)'이 가장 먼저해야합니다. – Shlomo