2012-09-10 29 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););   
} 

...等等的其他方法。