2013-04-15 48 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