2012-09-10 61 views
1

我想知道什麼是推薦的方式來處理(開始)InvokeOnMainThread調用遞歸調用的情況。遞歸InvokeOnMainThread塊

這種情況是這樣的......我有一個用戶界面按鈕按下,啓動下載和下載啓動音頻播放,音頻播放更改用戶界面。

的代碼看起來是這樣的:

void ButtonPressHandler(object sender, EventArgs args) 
{ 
    BeginInvokeOnMainThread(()=> { 
    StartDownload(CompletionHandler); 
}); 
} 

void CompletionHandler() 
{ 
BeginInvokeOnMainThread(()=> { 
    StartPlayback(PlaybackFinished); 
}); 
} 


void PlaybackFinished() 
{ 
BeginInvokeOnMainThread(()=> { 
    UpdateUI(); 
}); 
} 

什麼是處理這種情況的建議呢?我的用戶界面不會更新。我嘗試了BeginInvokeOnMainThread和InvokeOnMainThread。會有僵局嗎?

任何幫助表示讚賞。

回答

0

我能夠得到它的工作。在下載完成後,我使用tableview的row.GetActiveCell來使用它來更新UI。這似乎與GetCell相比,即使我做了SetNeedsDisplay,也沒有改變用戶界面。不知道有什麼區別。

0

這可能不是一個「遞歸」BeginOnMainThread調用的問題,但其他的東西。這裏有一些提示要檢查:

  • 是否實際調用了UpdateUI?
  • 如果您爲流程中的每個步驟調用UpdateUI,會發生什麼情況?它在哪裏停止工作?
  • 如果從ButtonPressHandler調用它,UpdateUI實際上是否工作?
+0

我的更新不會在UITableViewCell中設置圖像和文本的SetNeedsDisplay。如果我在第一個InvokeOnMainThread中工作。如果我在InvokeOnMainThread內部調用它,它不會執行任何操作。如果我做一個tableview單元格更新它總是工作,不管InvokeOnMainThread。 –

+0

爲了檢查線程,我在Update UI函數中打印了線程ID,它總是返回UI線程。但是,如果我在外部塊內調用更新UI,則更新可行,但在內部塊內不起作用。 –

+0

基本上這裏是我的用例。我有一個按鈕,按下後將更新UI,然後創建一個Web客戶端並異步啓動下載。然後當下載完成時,它將需要再次更新ui。第一次更新的作品,但第二次更新重置文本和按鈕圖像doesnt。我曾嘗試使用Performselector或CreateScheduledTimer無濟於事。 –

0

InvokeOnMainThread將暫停您的線程的執行,並等待委託在主線程上執行。完成後,線程恢復執行。 BeginInvokeOnMainThread沒有。

你有沒有試過類似的東西?

void ButtonPressHandler(object sender, EventArgs args) 
{ 
    if (NSThread.Current.IsMainThread) 
     StartDownload(CompletionHandler); 
    else 
     BeginInvokeOnMainThread(() => StartDownload(CompletionHandler););   
} 

...等等的其他方法。