[英]Asynchronous function execution?
在我的 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];
}
问题是微调器没有出现,因为 cpu 正在努力工作(类似的东西)。 就像代码在开始和停止时优先于视图的渲染一样。
我很想找到一种方法来有效地显示微调器的启动,而不使用计时器来延迟代码执行。
谢谢
如果您有类似的方法
-(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)获取所有需要运行 3 秒的代码,并将其放入一个 function 中,它是一个 void function 2)实例化你的微调器,但将其存储到一个可以在你的外部访问的变量中viewDidAppear 例程。 3) 启动一个新的 NSTimer,它以大约每四分之一秒左右的增量连续运行。 我将定义稍后每个循环调用的例程中的内容。 4) 使用 performSelectorInBackground 功能调用您在步骤 1 中创建的例程。 这实际上是现在将在后台运行您的启动(价值 3 秒),这实际上是让动画微调器出现并真正动画化的唯一方法。 5) 在您在步骤 1 中创建的例程中,在顶部添加一行代码,将(对象的全局)boolean 更新为 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 News Group 开发的示例应用程序。 当您按下按钮时,微调器会出现在屏幕的右上角。
http://itunes.apple.com/us/app/pepperdine-graphic-for-iphone/id516343215?mt=8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.