2014年12月3日 星期三

[Objective-C] NSTimer 倒數功能實作

有時候會想要每幾秒做同一件事,像是倒數計時之類的東西,那麼就必須使用NSTimer來完成

假設有一個變數n初值為5,我們想要每一秒讓它減 1,做五秒。

一開始可能會想到這樣子去實作

@property int n ;

- (void)viewDidLoad {
    [super viewDidLoad];
     self.n = 5
for (int i = 0; i < 5 ; i++) {
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(printN:) userInfo:nil repeats:NO];
    }
}

-(void)printN:(NSTimer *)timer
{
    NSLog(@"%i",self.n);
    self.n = self.n - 1;
}

利用迴圈執行五次Timer,每個Timer執行一秒,並且去呼叫那個方法

可是結果其實不會如預期所想的一樣


他在差不多的時間內就做完五次了。

Timer事實上是會跟執行序註冊要執行的時間點與方法,
i = 0的時候第一個timer註冊了1秒後幫我執行printN方法
i = 1的時候第二個timer註冊了1秒後幫我執行printN方法

for迴圈跑1~5,時間是非常短的,因此他們可能會在0.0001秒 0.0002秒 0.0003秒 0.0004秒 時註冊一秒後幫我執行printN方法,那以使用者的感受來說,幾乎是在同一秒執行。

那麼該怎麼真正的做一個倒數的功能呢

1.多設定一個變數 看要幾秒內做完
@property int second;
    self.second = 5; 假設要五秒

2.每一秒做一次,並且重複執行這個方法   (printN:)
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(printN:) userInfo:nil repeats:YES];

3.在printN:方法裡面加入一個判斷式
    self.second = self.second - 1;
    if(self.second == 0)
    {
        [timer invalidate];//停止這個Timer

    }

每一秒都去執行這個方法,在方法裡面更改終止條件,這樣就能實作倒數計時的功能。


完整程式碼

@property int n ;
@property int second;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.n = 5;
    self.second = 5;

    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(printN:) userInfo:nil repeats:YES];
}

-(void)printN:(NSTimer *)timer
{
    self.second = self.second - 1;
    if(self.second == 0)
    {
        [timer invalidate];
    }
    NSLog(@"%i",self.n);
    self.n = self.n - 1;

}

結果:
的確每秒更改一次了。