2014-02-26 36 views
0

这是我的需要:执行此操作的好方法?

我正在制作一个控制设备的ios应用程序。它有一个API,让我做这样的事情:

turnOnLights() 
turnOffLights() 
rotate(degrees) 
move(speed) 

等...(API是完全客观的C,我只是给在C synthax为例)

从这个API,我需要建立高层次序列,例如:

turn on all lights 
    wait 1 second 
    turn off all lights 
    wait 1 second 

或者

move 
rotate 30 degrees 
wait 1 second 
move 
rotate -30 degrees 

我能想到的哈克办法用定时器做这些,但我想知道如果的ObjectiveC有,我可以建立一些高水平的方法,所以我可以举例来说一个不错的方式:

ReturnValue flashLights() 
ReturnValue moveAndRotate() 

这背后的想法是说,所需要的命令做闪烁的行动将永远重复发送,并且,我可以这样做:

stopAction(returnValue) 

停止它。 (我知道我用C语言编写,但我觉得更清楚解释的东西)。

所以基本上,有没有一种方便的方法来制作一个脚本式的东西,我可以调用一个方法来启动一个动作。该操作会进行方法调用,等待一段时间,执行更多方法调用,并且在操作停止之前会一直重复此操作。

感谢

+1

'dispatch_after'不够? –

回答

1

我不知道我是否正确地理解你的问题,但如果你想重复调用一组与延迟方法之间,你可以使用一个performSelector:withObject:afterDelay,或者dispatch_after建立一个循环。 (而且有很多方法可以退出循环)

[self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1]; 

int delayInSecond = 10; 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayInSecond * NSEC_PER_SEC), 
dispatch_get_main_queue(), ^{ 
    //doing something  
}); 

performSelector:withObject:afterDelay调用延迟后使用默认的模式在当前线程上的接收器的方法。

此方法设置一个计时器,以在当前线程的运行循环中执行aSelector消息。定时器配置为以默认模式(NSDefaultRunLoopMode)运行于 。当定时器触发时,线程 尝试从运行循环中出列消息并执行 选择器。如果运行循环正在运行并且处于默认模式 ,则成功;否则,定时器将等待,直到运行循环处于默认的 模式。

dispatch_after将您的块添加到队列中,并且如果队列为空,它会在添加到队列后立即运行。否则,它必须等待队列中的其他任务完成后才能运行。

更多关于dispatch_after

dispatch_after

排队用于在指定的时间执行的块。

void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block); 

参数:

通过dispatch_time或dispatch_walltime返回的时间 里程碑。

队列该 队列上提交该块。队列由 系统保留,直到块运行完成。该参数不能为 NULL。

区块要提交的区块。该函数代表调用者执行Block_copy 和Block_release。该参数不能为 NULL。

讨论

此功能等待,直到指定的时间,然后以异步方式 块添加到指定的队列。

通过DISPATCH_TIME_NOW作为when参数被支持,但是 不是调用dispatch_async而是优化。未通过 DISPATCH_TIME_FOREVER未定义。

宣布派遣/ queue.h

0

个人而言,我不认为使用NSTimer是“哈克”只要你正确地实现它。一旦你完成它,你确实需要确保你使计时器无效;请参阅this thread以获取有关NSTimer最佳做法的更多信息。

// in YourViewController.h 
@property (nonatomic) BOOL flag; 
@property (nonatomic, strong) NSTimer* timer; 

// in YourViewController.m 
-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.flag = YES; 
    [self flashLights]; 

    // other code here 
} 

-(void)flashLights 
{ 
    CGFloat interval = 1.0f; // measured in seconds 

    self.timer = [NSTimer scheduledTimerWithTimeInterval:interval 
                target:self 
               selector:@selector(timerEventHandler) 
               userInfo:nil 
               repeats:YES]; 
} 

-(void)timerEventHandler 
{ 
    // your API calls might take a while to execute, so consider running them asynchronously: 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^
    { 
     if (self.flag) turnOnLights(); 
     else turnOffLights(); 

     self.flag = !self.flag; 
    }); 
} 

-(void)stopAction 
{ 
    [self.timer invalidate]; 
} 
+0

定时器很好......只要你明白runloops ... –