我在导航栏中有一个 UIBarButtonItem ,它使用 segue 切换到另一个屏幕。这个其他屏幕需要一些时间来初始化,我想在 UIBarButtonItem 上放置一个 UIActivityIndicator 以显示点击已注册,并且 iPad 正忙于执行操作。
我的做法是在UIBarButtonItem被按下后添加一个UIActivityIndicator,然后调用performSegueWithIdentifier:
,在viewDidLoad
第二个视图的方法中,将初始化放入dispatch_sync()
调用中。你可以猜到它不起作用......为什么?
第一个屏幕上的 IBAction:
- (void)tappedEdit: (UIBarButtonItem *)editButton {
// put activity indicator somewhere
UIActivityIndicatorView *indicator;
indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.frame = CGRectMake (200, 5, 50, 50);
[self addSubview: indicator];
[indicator startAnimating];
// follow segue
[self performSegueWithIdentifier: SegueShowDesignMode sender: editButton];
}
第二个屏幕上的初始化:
- (void)viewDidLoad {
[super viewDidLoad];
// put costly operations into another queue to free main queue for activity indicator
dispatch_sync (dispatch_get_global_queue (0, 0),
^{ // do initialization here
});
}
这样做的效果是 UIBarButtonItem 在执行初始化时保持点击状态,然后 UIActivityIndicator 很快可见,最后显示 segue 动画,显示第二个屏幕。
任何想法?非常感谢!
编辑:问题的一个补充可能是初始化做了一些 UIKit 的东西:当我尝试使用信号量时,初始化转储在一些 UITextView 方法中带有 BAD ACCESS。我猜这是因为它在一些“get_global_queue”上运行,而不是在“get_main_queue”上运行。
再次编辑:嗯,不。正如 Apple 文档中所宣布的,使用 'get_main_queue' 会导致死锁。所以问题归结为
“如何在运行微调器的同时创建后台 UIView(很多!)?”