1

我有一个较长的运行操作,我想同步运行(稍后我会看异步)。

我正在使用这里的覆盖代码 - 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循环完成后的Hide动画?

我可以像这样产生黑客/解决方法 -

    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 在开始循环之前将叠加层绘制到屏幕上。

4

2 回答 2

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(); }));

但它不太好(另外,检查右括号,我刚刚输入了这段代码)

于 2013-06-07T09:15:14.267 回答
1

将此组件添加到您的应用程序并完成它。无需重新发明轮子。

于 2013-06-06T13:07:31.007 回答