我刚刚开始在现有的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的任何更改。谢谢你的帮助。
答案 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);
我无法测试您的代码,因此可能需要一些摆弄。