次のように定義された、Reactive Extensions を使用した 3 つのサービス メソッドのセットを使用する Windows Phone 7 アプリケーションがあります。
public static class ServiceClient
{
public static IObservable<string> LookupImage(byte[] image) {...}
public static IObservable<XDocument> GetDefinition(string id) {...}
public static IObservable<Dictionary<string, byte[]>> GetFiles(string id, string[] fileNames) {...}
}
返される値が空でなくなるまで、WP7 アプリケーションLookupImage
が上記のクライアントを (毎回異なるbyte[] image
データ セットで)呼び出し続ける必要があります。IObservable<string>
文字列を取得したら、メソッドとメソッドを (この順序で)Observable
呼び出す必要があります。GetDefinition
GetFiles
への呼び出しはLookupImage
、タイマーによって制御されるのではなく、サービス応答が返されるたびに発生する必要があります。これは、ネットワーク接続速度によって異なるため、可能な限り多くの呼び出しを送信できる必要があるためです。
上記の解決策となる可能性のあるものへのポインタをいただければ幸いです。手始めに、私は次のものを持っています
private void RunLookupAndRenderLogic()
{
byte[] imageBytes = GetImageBytes();
// There are some cases where the image was not 'interesting' enough in which case GetImageBytes() returns null
if (pictureBytes != null)
{
// Where we have image data, send this to LookupImage service method
var markerLookup = ServiceClient.LookupImage(imageBytes);
markerLookup.Subscribe(id =>
{
// If the id is empty, we need to call this again.
if (String.IsNullOrEmpty(id))
{
???
}
// If we have an id, call GetDefinition and GetFiles methods of the service. No further calls to LookupImage should take place.
RenderLogic(id);
});
}
else
// If no interesting image was returned, try again
RunRecognitionAndRenderLogic();
}