假設有一個變數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執行一秒,並且去呼叫那個方法
可是結果其實不會如預期所想的一樣
2.每一秒做一次,並且重複執行這個方法 (printN:)
3.在printN:方法裡面加入一個判斷式
self.second = self.second - 1;
if(self.second == 0)
{
[timer invalidate];//停止這個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];
}{
self.second = self.second - 1;
if(self.second == 0)
{
[timer invalidate];
}
NSLog(@"%i",self.n);
self.n = self.n - 1;
}
的確每秒更改一次了。
沒有留言:
張貼留言