2013-10-25 45 views
1

Xamarin(C#)后,我有SlSvcUtil.exe产生WCF服务被称为与basicHttpBinding的。这一切都有效。我所做的只是注册一个回调,调用服务并等待数据。填充的TableView在主UI线程中调用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?我必须在这里错过简单的东西。

回答

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我尝试之前。