Заставить подписчика выслушать все изменения наблюдателя - PullRequest
0 голосов
/ 01 июня 2018

Я только начинаю с ReactiveX в существующем проекте Xamarin.iOS.Я хотел адаптировать свое предыдущее решение searchcontroller / uitableview к тому, в котором для практики использовался реактив.

Вот мой нынешний подход:

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();
}); 

Хотя сначала это работает, абонент не слушаетв любых других изменениях в моей наблюдаемой, кроме первой (наблюдатель успешно запускается при каждом изменении текста).Спасибо за любую помощь.

1 Ответ

0 голосов
/ 06 июня 2018

Можете ли вы попробовать это, пожалуйста?

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);

Я не могу проверить ваш код, поэтому может потребоваться немного возиться.

...