我有一个长时间运行的操作,我想同步运行(我稍后会看到异步)。
我正在使用此处的重叠代码 - http://docs.xamarin.com/recipes/ios/standard_controls/popovers/display_a_loading_message
这是我的测试代码 -
public override void ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
loadingOverlay = new LoadingOverlay (UIScreen.MainScreen.Bounds);
View.Add (loadingOverlay);
int i = 0;
while (i < 5000)
{
Console.WriteLine(i);
i++;
}
loadingOverlay.Hide ();
}
但是初始叠加没有显示,只有while循环完成后隐藏动画?
我可以像这样制作黑客/解决方法 -
public override void ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
loadingOverlay = new LoadingOverlay (UIScreen.MainScreen.Bounds);
View.Add (loadingOverlay);
NSTimer nstimer = NSTimer.CreateScheduledTimer (1, () => {
int i = 0;
while (i < 5000) {
Console.WriteLine (i);
i++;
}
loadingOverlay.Hide ();
});
}
但有人可以向我解释为什么会发生这种情况,以及如何正确编写代码,以便IOS在开始循环之前将覆盖图绘制到屏幕上。
答案 0 :(得分:4)
你正在阻止你不应该做的UI线程。任何长时间运行的操作都应该在后台线程中运行,即使您想以同步方式处理它。
使用Xamarin.iOS alpha(支持async / await),您的代码将如下所示:
public async override void ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
loadingOverlay = new LoadingOverlay (UIScreen.MainScreen.Bounds);
View.Add (loadingOverlay);
await Task.Factory.StartNew (() => {
int i = 0;
while (i < 5000)
{
Console.WriteLine(i);
i++;
}
});
loadingOverlay.Hide ();
}
如果您无法访问async/await
,则可以通过以下方式获得相同的结果:
Task.Factory.StartNew (() => {
int i = 0;
while (i < 5000)
{
Console.WriteLine(i);
i++;
}
}).ContinueWith(task => InvokeOnMainThread(() => { loadingOverlay.Hide(); }));
但它不太好(同样,检查结束括号,我只输入此代码)
答案 1 :(得分:2)
将this Component添加到您的应用程序并完成它。无需重新发明轮子。