让订阅者听取所有观察者的变化

时间:2018-06-01 17:45:29

标签: c# .net xamarin.ios system.reactive

我刚刚开始在现有的Xamarin.iOS项目中使用ReactiveX。我想将我之前的searchcontroller / uitableview解决方案改编成一个使用reactivex进行练习的解决方案。

这是我目前的做法:

var dataStream =
    Observable
        .FromEventPattern<UISearchBarTextChangedEventArgs>(
            ev => searchController.SearchBar.TextChanged += ev,
            ev => searchController.SearchBar.TextChanged -= ev)
        .Select(o => o.EventArgs.SearchText)
        .DistinctUntilChanged()
        .ObserveOn(SynchronizationContext.Current)
        .Synchronize()
        .Select(t =>
        {
            var lookup = new Lookup(prefix: t);
            smartyStreetsClient.Send(lookup);
            var data = new List<Suggestion>(lookup.Result);
            return data.ToObservable().ObserveOn(SynchronizationContext.Current);
        })
        .Switch();

dataStream.Subscribe(o =>
{
    suggestions.Add(o);
    TableView.Source = new ATableSource(suggestions);
    TableView.ReloadData();
}); 

虽然这首先起作用,但除了第一个(观察者在每次文本更改时成功运行观察者)之外,订阅者不再监听我的observable的任何更改。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

请你试试这个吗?

var dataStream =
    Observable
        .FromEventPattern<UISearchBarTextChangedEventArgs>(
            ev => searchController.SearchBar.TextChanged += ev,
            ev => searchController.SearchBar.TextChanged -= ev)
        .Select(o => o.EventArgs.SearchText)
        .DistinctUntilChanged()
        .SelectMany(t => Observable.Start(() =>
        {
            var lookup = new Lookup(prefix: t);
            smartyStreetsClient.Send(lookup);
            var data = new List<Suggestion>(lookup.Result);
            return data;
        }))
        .ObserveOn(SynchronizationContext.Current);

我无法测试您的代码,因此可能需要一些摆弄。