在我的iOS应用中,我会执行以下操作。
viewDidAppear(){
// Load a spinner in a view on the top
[DSBezelActivityView newActivityViewForView:self.view];
// Execute code that require 3 seconds
...
// Stop the spinner
[DSBezelActivityView removeViewAnimated:YES];
}
问题是spinner没有出现,因为cpu正在努力工作(类似的东西)。这就像开始和停止之间的代码优先于视图的渲染。
我很想找到一种方法来有效地展示微调器的开始,而不使用计时器来延迟代码执行。
由于
答案 0 :(得分:22)
如果你有像
这样的方法-(void) showSpinner:(UIView*)view {
dispatch_async(dispatch_get_main_queue(), ^{
[DSBezelActivityView newActivityViewForView:view];
});
}
有几种方法可以从不同的线程调用它。从以下选项中选择一个:
[NSThread detachNewThreadSelector:@selector(showSpinner:) toTarget:self withObject:self.view];
// or
[self performSelectorInBackground:@selector(showSpinner:) withObject:self.view];
// or
NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(showSpinner:) object:self.view];
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation:invOperation];
// or
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self showSpinner:self.view];
});
按住Alt并单击以获取详细信息。
答案 1 :(得分:1)
将启动和停止活动指示器之间的代码移动到单独的线程中,因为它阻塞了主线程。这就是活动指标没有显示的原因。
修改:Example
答案 2 :(得分:0)
我同意第一个答案并进行了一些修改。我刚刚经历了同样的问题。问题是,当您拥有需要时间的代码时,任何图形都会自动转移到后台更新。无论如何,将旋转器抛向背景是它实际上正在做的事情。你想要的是(遗憾的是)主代码在后台运行,而微调器在前台运行。我知道这听起来很糟糕,但在某些情况下允许你的代码运行得慢一点,以表明应用正在做一些有用的事情对用户有益。
为了让微调器工作: 1)获取运行3秒钟的所有代码,并将其放入一个void函数的函数中 2)实例化您的微调器,但将其存储在viewDidAppear例程之外可访问的变量中。 3)启动一个新的NSTimer,它以大约每四分之一秒的速度连续运行。我将定义每个循环后调用的例程。 4)使用performSelectorInBackground功能调用您在步骤1中创建的例程。这基本上现在将在后台运行您的启动(价值3秒),这实际上是允许动画微调器显示和真正动画的唯一方法。 5)在您在步骤1中创建的例程中,在顶部添加一行代码,将(全局到对象)布尔值更新为true,表明我们处于主3秒例程的中间。 6)在步骤1中定义的例程结束时,添加一行代码,将步骤5中定义的相同全局设置为false,表示我们的3秒例程已完成。 7)在计时器例程中,我们现在想做一些如下所示的事情:
// If busy that start the spinner
if(YES == busy){
[spinner startAnimating];
}else{
[spinner stopAnimating];
// Here we can also stop and deallocate the timer
}
如果您需要更多关于此主题的帮助,我确实可以提供准确的代码。看一下我为Pepperdine新闻组开发的示例应用程序。当您按下按钮时,微调器会出现在屏幕的右上角。
http://itunes.apple.com/us/app/pepperdine-graphic-for-iphone/id516343215?mt=8