在等待主视图加载时显示 UIView?

Posted

技术标签:

【中文标题】在等待主视图加载时显示 UIView?【英文标题】:Display UIView while waiting for main view to load? 【发布时间】:2015-04-27 01:29:06 【问题描述】:

所以我试图在我的应用程序中创建一些加载屏幕。我有一个需要 3-10 秒才能加载的视图。在此期间,我想显示一个我制作的 UIView,它只是带有加载屏幕的黑色。目前,我将代码放在超级 viewDidLoad 之后的 viewDidLoad 函数中。这是我的代码

UIView* baseView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:baseView];
[baseView setBackgroundColor:[UIColor blackColor]];
[self.view bringSubviewToFront:baseView];
baseView.layer.zPosition = 1; 

这可以正常工作并按照我想要的方式创建我的视图,但是这要等到我的主视图完全加载完成后才会真正显示任何内容。 viewDidLoad 不是放置这个的好地方吗?如果是,我应该把它放在哪里。

简单地说,我有一个非常基本的 UIView,我想在等待实际视图加载时加载它,然后简单地隐藏它。任何想法如何做到这一点?

【问题讨论】:

为什么您的视图需要 3-10 秒才能加载? 你在哪里运行需要时间的代码?听起来您需要异步调度它 该视图需要很长时间才能加载,因为它必须下载大量内容,我正在努力使所有内容异步但是这更多是一个临时修复,因为我将无法使其异步大约一个月。 在您可以将加载移动到后台线程之前,您将阻止 UI 更新。你不应该花一个月的时间来做这件事。您需要做的就是在代码周围包裹一个dispatch_async,并让它在完成后调用一个方法。 嗯,它不是那么简单,我有几个函数会导致加载非常复杂。它不像将它包装在 dispatch_async 中那么简单,除此之外,我还有其他需要首先完成的事情,因此需要临时修复。这也将作为一个很好的加载器,即使在普通视图上延迟 300 毫秒-1 秒。 【参考方案1】:

您需要将您的辛勤工作分派到另一个线程上,否则操作系统将等到所有进程完成后再刷新 UI(这就是为什么您会看到加载屏幕仅在 3-10 秒后出现)。

在冗长的工作完成后,不要忘记在主线程上分派。所有 UI 更新都必须在主线程上完成。

self.loadingView.hidden = NO;
// Dispatch lengthy stuff on another thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
    // Do lengthy stuff here

    // Dispatch back on the main thread (mandatory for UI updates)
    dispatch_async(dispatch_get_main_queue(), ^
        self.loadingView.hidden = YES;
    );
);

【讨论】:

或者如果您真的希望在主线程上执行冗长的工作,我认为您可以使用[self performSelector:@selector(lengthyJobMethod) withObject:nil afterDelay:0] 让您的加载视图有时间显示,但我强烈建议将你的东西移到dispatch_async【参考方案2】:
UIView* baseView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:baseView];
[baseView setBackgroundColor:[UIColor blackColor]];
[self.view bringSubviewToFront:baseView];
baseView.layer.zPosition = 1; 

//Create new dispatch for load data
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
    // Load data in here

    // Call main thread to update UI
    dispatch_async(dispatch_get_main_queue(), ^
        baseView.hidden = YES;
    );
);

【讨论】:

以上是关于在等待主视图加载时显示 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

uiview 子类在第一次调用 setneedsdisplay 时显示为黑色矩形,但在那之后就可以了

当变量满足条件时显示 UIView

角度动画滑动面板 - 加载视图时显示第二个

我有一个在应用启动时显示的登录视图。在它加载之前的一瞬间,我看到它是父视图。我怎样才能阻止这个?

如何停止 ValidationMessageFor 在加载时显示错误消息?

Tableview 行显示槽加载视图