【问题标题】:show activity indicator while loading ViewController加载 ViewController 时显示活动指示器
【发布时间】:2012-09-25 06:00:39
【问题描述】:

我有一个 ViewController 需要时间来加载它的视图。当我运行 Instruments 时,我从主屏幕看到,如果我点击将视图控制器推入堆栈的图标,它的一半是布局视图,一半是获取视图的数据。当按下按钮将 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];
}

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

【问题讨论】:

  • 你能澄清你的问题吗?
  • @Mr. Jefferson 抱歉,点击提交太快了!

标签: iphone


【解决方案1】:

当您说获取视图数据需要时间时,我假设您的意思是 PuzzleViewControllerviewDidLoad 之类的地方做了一些不平凡的事情。

假设它位于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];
         });
    });
}

这意味着代价高昂的操作将放在后台线程上,并且不会阻塞视图控制器的加载/显示。

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

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

【讨论】:

  • 那么在那种情况下,活动指示器是在正在加载的页面上,而不是在之前的 ViewController 上吧?
  • @Crystal - 如果您的操作足够长(在过渡动画之后需要一秒或更长时间)并且它的完成对于显示视图控制器至关重要,您应该考虑使用MBProgressHUD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多