2013-10-25 65 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我嘗試之前。