2011-02-12 3 views
2

제 생각에는 RX 함수에 대한 "느낌"이 꽤 있습니다 - 나는 그 중 많은 수를 사용하거나 다른 것이 유용 할 수 있다고 상상할 수 있습니다. 그러나 찾을 수는 없습니다. .Prune 함수를위한 장소. 이것이 AsyncSubject에 대한 멀티 캐스트이지만 이것이 실제 시나리오에서 어떻게 유용 할 수 있는지 알고 있습니까?.PublishLast() (이전에 가지 치기)에 대한 사용 사례

편집 : Richard는 WebRequest가 Prune()의 좋은 후보라고 말합니다. 나는 아직도 어떻게 보이지 않는다. 다음의 예제를 보자 - 나는 이미지에 수신 된 URI의 변환하려면 :

public static IObservable<BitmapImage> ToImage(this IObservable<string> source) 
    { 
     var streams = 
      from wc in source.Select(WebRequest.Create) 
      from s in Observable 
       .FromAsyncPattern<WebResponse>(wc.BeginGetResponse, 
        wc.EndGetResponse)() 
       .Catch(Observable.Empty<WebResponse>()) 
      select s.GetResponseStream(); 
     return streams 
      .ObserveOnDispatcher() 
      .Select(x => 
         { 
          var bmp = new BitmapImage(); 
          bmp.SetSource(x); 
          return bmp; 
         }); 
    } 

난 당신이 (뜨거운) FromAsyncPattern()를 호출 할 때 있기 때문에 필요 .FromAsyncPattern에 .Prune를 추가 표시되지 않습니다 당신은 "즉시"구독합니다.

+4

자두? 대기열에 백 로그가있는 경우 ;) –

답변

2

마찬가지로 was confirmed on the RX Forum 프룬은 단지 편의 연산자입니다. 당신의 관찰이 하나의 값을 가지고 있으며, 당신이 그것을 게시하는 경우

, .Prune() 내 경험에서 그래서

단일 호출 \ 연결을 게시 대체 할 수있는, 자두에 대한 가장 일반적인 시나리오는 다음과 같습니다

  • 당신은 부작용을 생산하고 당신은
뜨거운 (때문에 부작용의) 만들고 싶어, 그래서 그 관찰에 하나 명 이상의 가입자를 가지고
  • 하나 개의 값을 방출하는 감기 관찰 할 수있다

    포럼에서 지적한 다른 하나는 주목할만한 관찰 가능 항목 (보통 첫 번째 항목)에 특정 값을 캐시해야 할 때입니다. 그런 다음 FromEvent (...)를 사용합니다. Take (1) .Prune()을 구독하면이 값을 보장 받게됩니다. 이 것은 단지 "편의"가 아니라 결과를 얻는 유일한 방법입니다.

    매우 유용합니다.

  • 2

    가장 일반적인 시나리오는 소스 관찰 가능 항목이 뜨거워서 구독하기 전에 완료 할 수있는 경우입니다. AsyncSubject는 마지막 값을 캡처하고 향후 구독자에게 다시 표시합니다.

    편집

    내가 확인해야 할 것,하지만 난 그렇게 "제된"이미 실제로, FromAsyncPattern는 내부적으로 AsyncSubject 사용 믿습니다.

    그러나, 당신은하지 않았다 다른 핫 소스와 함께 작업하는 가정하면, Prune의 사용은이에 가입 전에 IObservable의 수명에 완전히 내려 온다. 즉시 구독하는 경우 Prune은 필요하지 않습니다. 그러나 IObservable이 구독되기 전에 잠시 동안 존재한다면 이미 완료되었을 수 있습니다.

    이것은 Rx를 이식했지만 결코 사용하지 않은 사람으로서 내 이해입니다 Prune. 아마도 Rx forums에서 같은 질문을해야할까요? Rx 팀의 누군가가 응답 할 수있는 기회를 얻었습니다.

    +0

    어쨌든 나의 시나리오에서는 컨테이너가 파괴 될 때까지 뜨거운 관측 가능 물이 실행 중이다. 그래서 나는 뜨거운 질문에 대한 마지막 가치가 필요할 때 "웹 요청, UI 상호 작용 등의 작업에 대한 예제를 제공합니다."라는 질문을 다시 할 수 있습니다. –

    +0

    당신은 스스로 말하기를, 웹 요청은 가지 치기를위한 완벽한 상황입니다. –

    +0

    내 편집을 참조하십시오. 구체적인 코드 예제에서 왜 설명 할 수 있습니까? "여기에 가지 치기를 넣지 않으면이 나쁜 일이 일어날 것"처럼. –

    1

    작업 (예 : 콜백)을 청취해야하는 여러 UI 구성 요소가 있고 기본적으로 콜드 관찰 가능 항목의 Subscribe()가 여러 가지 작업을 시작하게 할 때 깔끔한 사용법을 발견했습니다. 시간은 일반적으로 UI 구성 요소에서 상태를 공유 할 때 원하는 것이 아닙니다.

    리차드가이 점들을 많이 언급했음을 알고 있지만이 예제를 추가하기 위해 단일 실행 태스크에 대한 완벽한 후보라고 생각했습니다.

    var oTask = Observable.FromAsync(() => Task.Factory.StartNew(() => 
                      { 
               Thread.Sleep(1000); 
               Console.WriteLine("Executed Task"); 
                      })); 
    
    //Setup the IConnectedObservable 
    var oTask2 = oTask.PublishLast(); 
    
    //Subscribe - nothing happens 
    oTask2.Subscribe(x => { Console.WriteLine("Called from Task 1"); }); 
    oTask2.Subscribe(x => { Console.WriteLine("Called from Task 2"); }); 
    
    //The one and only time the Task is run 
    oTask2.Connect(); 
    
    //Subscribe after the task is already complete - we want the results 
    Thread.Sleep(5000); 
    oTask2.Subscribe(x => { Console.WriteLine("Called from Task 3"); }); 
    
    +0

    내 답변에 설명 된 것과 동일한 시나리오라고 생각합니까? –