异步函数执行?

问题描述:

在我的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 + click for details。

+1

这对我有效!最后一个选项是最好的,因为我不需要创建一个函数来创建一个更复杂的函数。 TNX! ;) – jollyr0ger 2011-06-03 12:51:26

+0

前3个选项正在更新后台线程的UI ... – TheBlack 2011-06-03 16:26:10

+0

@Jano感谢了很多伟大的工作。 – 2013-07-19 07:02:32

移动代码。这就是为什么没有显示活动指标。

编辑:Example

+1

没想到从任何的UIKit应该从另一个线程调用还是我错了?谢谢 – theiOSDude 2011-06-03 10:01:34

+0

如果可能的话,我怎样才能在另一个线程中调用该代码? – jollyr0ger 2011-06-03 10:44:18

+0

查看nsinvocation多数民众赞成在当我开始倾斜它.. GCD是一个替代,但国际海事组织并不那么好 - http://www.icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your- apps-with-nsoperation/ – theiOSDude 2011-06-03 10:45:26

我同意第一个答案和几个修改。我刚刚经历了这个完全相同的问题。问题在于,如果有代码需要时间来完成,任何图形将自动移动到后台更新。无论如何,将微调投入背景是它无论如何要做的。你想要的是(可悲的是)你的主代码在后台运行,微调器在前台运行。我知道这听起来很糟糕,但在某些情况下,允许您的代码运行速度稍慢,以表明应用程序正在执行某些有用的操作对用户有益。

为了得到微调工作: 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 News Group开发的示例应用程序。当你按下按钮时,微调器出现在屏幕的右上角。

http://itunes.apple.com/us/app/pepperdine-graphic-for-iphone/id516343215?mt=8