2014-02-26 122 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 ... –

相關問題