gpt4 book ai didi

iphone - 加载 ViewController 时显示事件指示器

转载 作者:行者123 更新时间:2023-12-03 19:06:50 26 4
gpt4 key购买 nike

我有一个 ViewController,需要一些时间来加载其 View 。当我运行 Instruments 时,我从主屏幕上看到,如果我点击将该 View Controller 推送到堆栈上的图标,则一半会布局 View ,一半会获取 View 的数据。我尝试添加一个事件指示器,当按下按钮将 LongRunningViewController 插入堆栈时,该指示器会显示在按钮上方的主屏幕上。所以我基本上这样做:

- (IBAction)puzzleView:(id)sender {
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicator startAnimating];
});

PuzzleViewController *detailViewController = [[[PuzzleViewController alloc] init] autorelease];
[self.navigationController pushViewController:detailViewController animated:YES];
[self.activityIndicator stopAnimating];
}

按下按钮时主屏幕出现滞后,然后加载 View 。我试图在另一个屏幕准备被推送时显示事件指示器(或者至少我认为它是这样工作的)。但事件指示器不显示。我想知道这是否可以做到?或者其他应用程序是否推送他们的 ViewController,然后在该屏幕上,他们有事件指示器显示不同资源的加载情况?

最佳答案

当您说获取 View 数据需要时间时,我假设您的意思是 PuzzleViewController 在诸如 viewDidLoad 之类的地方做了一些不平凡的事情。

假设它在 viewDidLoad 中。然后你可以这样做:

-(void)viewDidLoad
{
[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
//do something expensive
[self doSomethingExpensive];

//dispatch back to the main (UI) thread to stop the activity indicator
dispatch_async(dispatch_get_main_queue(), ^
{
[self.activityIndicator stopAnimating];
});
});
}

这意味着昂贵的操作将被放在后台线程上,并且不会阻止 View Controller 的加载/显示。

此方法在用户按下按钮时立即显示请求的 View ,并在该屏幕上显示进度。我认为这种方式比在呈现 View 之前加载内容时显示事件 View 更常见。这也为你赢得了更多的时间;您的长操作可以在过渡动画期间在后台运行!

您的事件 View 未显示您正在执行的操作方式的原因是您正在 UI 线程上执行所有操作;使用 dispatch_async 从主队列到主队列不会完成任何事情,因为在运行循环完成之前,您的 block 将没有机会运行。

关于iphone - 加载 ViewController 时显示事件指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12573279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com