0

ネットワークからダウンロードした文字列のリストを表示する単純な TableView があります。リストは非常に大きい (~140k 文字列)。AddRange を使用しても何も起こりませんが、小さな 2 項目リストを静的にコーディングすると、正常に動作します。

ビュー モデルのリロード コマンドのコード:

        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でこれをやろうとしています。

4

3 に答える 3

0

この問題は ReactiveUI 6.2.1 で修正されたようです。

于 2014-11-25T14:25:48.523 に答える
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;
    }
于 2014-11-22T02:32:07.723 に答える