我刚刚在现有的Xamarin.iOS项目中开始使用ReactiveX。我想将我以前的搜索控制器/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();
});
虽然这在一开始是有效的,但除了第一个之外,订阅者并没有监听对我的可观察对象的任何更多更改(观察者在每个文本更改上都成功运行(。感谢您的任何帮助。
你能试试这个吗?
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);
我无法测试您的代码,因此可能需要一些摆弄。