代码之家  ›  专栏  ›  技术社区  ›  Chuck Vose

如何在执行计算密集型任务之前向视图中添加微调器

  •  0
  • Chuck Vose  · 技术社区  · 14 年前

    我有一个uitableviewcontroller,当我将一个特定的视图推到堆栈上时,需要花费很长时间,所以我想在移动之前向单元格中添加一个微调器。我遇到的问题是,在将新视图推送到控制器堆栈后,会添加微调器。但我认为信息是同步的?

    因此,在转到下一个视图之前,如何使此微调器显示?提前谢谢!

    - (void)
        tableView: (UITableView *) tableView
        didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
    
        UITableViewCell *cell = [ self.tableView cellForRowAtIndexPath: indexPath ];
    
        if (cell.accessoryType == UITableViewCellAccessoryDisclosureIndicator) {
            UIActivityIndicatorView *activityIndicator = [ [ UIActivityIndicatorView alloc ] initWithFrame: CGRectMake(260.0, 10.0, 25.0, 25.0) ];
            activityIndicator.hidesWhenStopped = YES;
            activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
    
            [ cell addSubview: activityIndicator ];
            [ activityIndicator startAnimating ];
    
            TableDemoViewController *newViewController = [ [ TableDemoViewController alloc ] initWithPath: cell.textLabel.text ];
            UINavigationController *navigationController = [ appDelegate navigationController ];
            [ navigationController pushViewController: newViewController animated: YES ];
            [ activityIndicator stopAnimating ];
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Colin Barrett    14 年前

    如果简单地初始化tabledemoviewcontroller是如此密集的工作,那么您还有其他问题。记住,正如您所指出的,主线程是同步的。你有两个选择:

    • 在添加微调器后简单地旋转一次run循环可能会解决您的问题。您可以将方法分成两部分,并使用表demoviewcontroller in it调用第二部分 performSelector:withObject:afterDelay: 延迟为0。
    • 您可能想找出init如此昂贵的原因,并将其从主线程中移除。我强烈建议您学习如何使用nsoperations和nsoperationqueue。您可以使用委托模式或nsnotificatin让调用者知道何时完成代价高昂的操作。

    一般来说,如果有什么东西阻塞了主线程上的处理,那就糟糕了。你想尽快把它从主线上移开。主线程是输入事件和动画发生的地方——主线程自由运行的能力是保持应用程序响应迅速的原因。请记住,即使用户无法提升应用程序的状态,也可能有很多她可以与之交互的内容和她可以看到的内容。