RxUI的命令和其它MVVM中實作ICommand的最大不一樣的地方就是 – 它可以有回傳值(當然,是reactive式的IObservable
)!
之前剛學Prism(under Xarmin.Forms)的時候,在DelegateCommand的說明那裡找不到回傳值的用法,再看了一次RxUI的API說明,才發覺到正常來說,ICommand介面的實作中基本上就是執行動作,其概念中是不管動作的執行結果的,不管是Prism中的DelegateCommand或MvvmLight中的RelayCommand都是如此。
而在Reactive的世界中,實作時思考的方式是需要改變的,如上一篇blog介紹的範例中,RetrieveWordCommand的定義如下:
public ReactiveCommand<Unit, List<WordOption>> RetrieveWordCommand
ReactiveCommand<Unit, List<WordOption>>
表示此命令不需要代入參數(Unit),但會傳回一IObservable<List<WordOption>>
,因此,在建立此命令的程式中:
RetrieveWordCommand = ReactiveCommand.CreateFromTask<List<WordOption>>(async (arg) =>
{
// ...
return wordResults.Select(wr => new WordOption{ //... }
}, canRetrieve);
它回傳了一個可觀察佇列,且在接續的程式中,定義了當其命令完成後的動作:
RetrieveWordCommand
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(wordOptions =>
{
// ...
});
程式中,ObserveOn表示後續動作會在其指定的執行緒上被執行,此例中是UI主執行緒,因為它會修改被綁定到View上的屬性,而Subscribe中則會收到原先定義的回傳值List<WordOpton>
當參數。
Written with StackEdit.
沒有留言:
張貼留言