【问题标题】:Display UIView while waiting for main view to load?在等待主视图加载时显示 UIView?
【发布时间】: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 秒。

标签: ios objective-c xcode uiview xib


【解决方案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;
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2015-08-05
    相关资源
    最近更新 更多