rxcpp

2017-07-11 7 views
2

に要求/応答ストリームを処理する方法を私はrxcppにカメラサンプリングシステムを実装する必要があります..私は、これはのparamとしてrequestStreamを渡すとresponseStreamrxcpp

たびrequestSampleが呼び出されるを受信して​​いる想像方法、新しいカメラのセッションが作成され、on_completeは()requestStreamのために呼び出されたときに、カメラセッションは

observable<ImageSample> requestSampleStream(observable<ImageRequest> requestStream$) { 
    auto response$ = rxcpp::observable<>::create<ImageSample>(
    [&](rxcpp::subscriber<ImageSample> s){ 
    auto request_next = [&](ImageRequest imageRequest) { 
     cout << "image request next" << endl; 
     SampleImage vsi; 
     s.on_next(vsi); 
    }; 

    auto request_completed = [&] { 
     cout << "no more samples needed.. close camera" << endl; 
     s.on_completed(); 
    }; 

    auto request_error = [&](std::exception_ptr e) { 
     try { rethrow_exception(e); } 
     catch (const exception &ex) { 
     cerr << "error happened on request stream.. close the camera and send error on return stream" << endl << ex.what() << endl; 
     } 

     s.on_error(e); 
    }; 

    requestStream$.subscribe(request_next, 
           request_error, 
           request_completed 
    ); 
    }); 

    return response$; 
} 

を終了している問題ここでrequestStream$.subscribe(request_next..が呼び出された時点で、私はEXC_BAD_ACCESSを取得することである

答えて

2

sはローカルスタック変数ですが、lambdaはsへの参照をキャプチャしています。この参照は、ラムダが呼び出されるまでに無効です。 [&]から[=]に変更してください。

もう1つの選択肢は、既存のmapアルゴを使用することです。

observable<ImageSample> requestSampleStream(observable<ImageRequest> requestStream$) { 
    return requestStream$ | 
     map([](ImageRequest imageRequest){ 
      cout << "image request next" << endl; 
      SampleImage vsi; 
      s.on_next(vsi); 
     }) 
     // optional 
     | tap([&](std::exception_ptr e) { 
      try { rethrow_exception(e); } 
      catch (const exception &ex) { 
       cerr << "error happened on request stream.. close the camera and send error on return stream" << endl << ex.what() << endl; 
      } 
     }, 
     [](){ 
      cout << "no more samples needed.. close camera" << endl; 
     }) 
     ; 
} 
+0

スポットには何がありますか?もっと多くのrxcpp-ish方法はありますか?地図をタップしてタップしますか? – Ciprian

+0

ええ、既存の地図を使用してalgoは、マップを再現するcreateを使用するよりも優れています。 –

+0

私の唯一の問題は、マップの結果が非同期であるため、マップが同期的に戻ることができないということです。その回避策はありますか? – Ciprian