2014-11-20 23 views
0

我有一个简单的TableView,显示从网络下载的字符串列表。该列表非常大(约140k字符串)。使用AddRange并且什么都没有发生,但是如果我静态编码一个小的2项列表,它可以正常工作。ReactiveList.AddRange不适用于大集合

在视图模型代码reload命令:

 public ReactiveCommand<List<string>> LoadItems { get; protected set; } 

     // Later, in the constructor... 

     LoadItems = ReactiveCommand.CreateAsyncObservable(_ => BlobCache.LocalMachine.GetAndFetchLatest(
      client.ItemListKey, 
      client.FetchItemList)); 

     LoadItems.Subscribe(list => { 
      ItemList.Clear(); 
      ItemList.AddRange(list); 
     }); 

如果我将其更改为这样的事情,虽然,这实际上增加了细胞表视图:

 LoadItems.Subscribe(list => { 
      Console.WriteLine(list.Count); // To see if it's working (it is) 
      var stuff = new List<string>() { 
       "Test item!" 
      }; 
      ItemList.AddRange(stuff); 
     }); 

我的猜测是,我以非常低效的方式添加项目,而不是从AddRange调用返回。我是Rx/ReactiveUI/MVVM/all-this-cool-linq-stuff的新手,但前提非常棒。

什么是值得的 - 我试图在MonoTouch上做到这一点。

回答

0

看起来像这个问题已在ReactiveUI 6.2.1中修复。

0

我喜欢这个尝试检查。

var search = this.ObservableForProperty(x => x.SearchQuery, _ => _) 
      .Throttle(TimeSpan.FromMilliseconds(100)) 
      .DistinctUntilChanged() 
      .Select(q => Observable.Start(() => 
      { 
       var searchResult = getSearchQuery(q); 
       return searchResult; 
      }).ObserveOn(SynchronizationContext.Current)) 
      .Switch() 
      .Select(x => new ReactiveList<IProduct>(x.Result)) 
      .ToProperty(this, x => x.SearchResultList, out _SearchResultList); 

,我的作用是

public async Task<IEnumerable<IProduct>> getSearchQuery(string query) 
    { 
     var service = new ProductService(); 
     var result = await service.SearchProductAsync(query); 
     return result; 
    } 
相关问题