2014-11-20 62 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; 
    } 
相關問題