异步函数执行?

时间:2011-06-03 09:52:49

标签: iphone objective-c ios

在我的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正在努力工作(类似的东西)。这就像开始和停止之间的代码优先于视图的渲染。

我很想找到一种方法来有效地展示微调器的开始,而不使用计时器来延迟代码执行。

由于

3 个答案:

答案 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