在等待主视图加载时显示 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 时显示为黑色矩形,但在那之后就可以了
我有一个在应用启动时显示的登录视图。在它加载之前的一瞬间,我看到它是父视图。我怎样才能阻止这个?