2013-04-15 43 views
0

我正在使用ReactiveUI。在一個按鈕上,我想調用一個web服務。如果此調用成功,我想更新我的用戶界面。ReactiveAsyncCommand.RegisterAsyncAction - 缺少完成通知?

當註冊異步函數RegisterAsyncFunction時,您會看到一個您可以訂閱的可觀察值。這使您有機會在異步代碼返回時運行代碼,並且還可以使用ObserveOnDispatcher()在UIThread上運行代碼。

唯一的問題是 - 我的命令沒有返回值。

我想RegisterAsyncAction就是爲了這個目的,但是我找不到任何方法知道這個動作何時完成。

在這種情況下使用ReactiveAsyncCommnand的正確方法是什麼?

回答

1

hwhoops,看起來你已經發現了一個bug在RegisterAsyncAction,它應該返回IObservable<Unit>

在此期間,只需複製粘貼修正版本到您的應用程序,它只是一個擴展方法:

/// <summary> 
    /// RegisterAsyncAction registers an asynchronous method that runs 
    /// whenever the Command's Execute method is called and doesn't return a 
    /// result. 
    /// </summary> 
    /// <param name="calculationFunc">The function to be run in the 
    /// background.</param> 
    public static IObservable<Unit> RegisterAsyncAction(this IReactiveAsyncCommand This, 
     Action<object> calculationFunc, 
     IScheduler scheduler = null) 
    { 
     return This.RegisterAsyncFunction(x => { calculationFunc(x); return Unit.Default; }, scheduler); 
    } 

你也可以ObserveOnDispatcher()在UIThread上運行代碼。

實際上,您不需要這樣做,RxUI已經保證Register*的結果會返回到UI線程。

+0

我切換到'RegisterAsyncFunction',返回一個虛擬值。稍後,我在ReactiveAsyncCommand上找到了一個'AsyncCompletedNotification'。我沒有嘗試,但它看起來像一個可能的解決方案? – Vegar

+0

雖然它丟失了返回方法的數據,但最好使用Register * –

+0

的返回結果,在這種情況下,不會有返回值丟失。但是返回'IObservable'的'RegisterAsyncAction'在任何情況下都更好。謝謝! – Vegar