【问题标题】:Populate TableView in main UI thread after calling WCF service调用 WCF 服务后在主 UI 线程中填充 TableView
【发布时间】:2013-10-25 21:32:05
【问题描述】:

Xamarin (C#) 中,我有一个使用 SlSvcUtil.exe 生成的 WCF 服务,该服务使用 BasicHttpBinding。这一切都有效。我所做的只是注册一个回调,调用服务,然后等待数据。

这部分并不重要,但我们必须包装我们的对象以使 WCF 发挥得很好。所以我创建了一个函数来包装 WCF 调用并返回我们未包装对象的列表。这一切也都有效。

问题是,我正试图从 TableViewControllerTableViewSource 内部使其工作。如果我的所有回调都类似于以下内容,则它可以工作:

//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?我必须在这里遗漏一些简单的东西。

【问题讨论】:

    标签: c# wcf asynchronous xamarin.ios xamarin


    【解决方案1】:

    看来我刚刚想通了。 Threading in Xamarin is described here.

    我所要做的就是:

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

    InvokeOnMainThread 是在 NSObject 上定义的,因此您可以直接调用它,而不是像我之前尝试的那样使用 TableView.InvokeOnMainThread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      相关资源
      最近更新 更多