1

Xamarin (C#)内には、 BasicHttpBindingで呼び出されるSlSvcUtil.exeで生成されたWCF サービスがあります。それはすべてうまくいきます。コールバックを登録し、サービスを呼び出し、データを待つだけです。

この部分はあまり重要ではありませんが、WCFを適切に機能させるには、オブジェクトをラップする必要がありました。そこで、WCF呼び出しをラップし、ラップされていないオブジェクトのリストを返す関数を作成しました。それもすべて機能します。

問題は、これをTableViewController 内またはTableViewSource内から機能させようとしていることです。私のコールバックがすべて次のようなものである場合、それは機能します:

//Inside TableViewSource
private void Callback(List<MyObject> objects) {
    for (int i = 0; i < objects.Count; i++) {
        _items.Add(objects[i]);
    }
}

ただし、まだ電話する必要がありますTableView.ReloadData()。メインの UI スレッドにいないため、これを呼び出すと失敗します。関数はありTableView.BeginInvokeOnMainThread(NSAction action)ますが、NSActionはパラメーターを取ることができないため、リストを返すことができません。

私も通知を投稿しようとしましたが、同じ理由で失敗しています (おそらくコールバック内から投稿しているため):

//Inside TableViewController
private void PropertyChanged(NSNotification notification) {
    TableView.ReloadData();
    // or TableView.BeginInvokeOnMainThread(() => TableView.ReloadData());
}

//Inside TableViewSource
private void Callback(List<MyObject> objects) {
    //work here
    NSNotificationCenter.DefaultCenter.PostNotificationName("Objects", this);
}

リストをメイン UI スレッドに渡してTableViewにデータを入力するにはどうすればよいですか? ここで単純なものが欠けているに違いありません。

4

1 に答える 1

1

私はちょうどそれを理解したように見えます。Xamarin でのスレッド化については、こちらで説明しています。

私がしなければならなかったのは:

//Inside TableViewController
private void Callback(List<MyObject> objects) {
    InvokeOnMainThread(() => {
        ((MyTableViewSource)TableView.Source).AddObjects(objects);
        TableView.ReloadData();
    });
}

InvokeOnMainThreadは on で定義されているので、前に試したようにNSObject使用する代わりに呼び出すことができます。TableView.InvokeOnMainThread

于 2013-10-25T21:45:48.740 に答える