項目中有個功能需要在修改完一個值后,馬上請求新值并刷新頁面,使用了定時器,寫上代碼發現不是自己想要的效果。然后發現自己對于定時器的使用有錯誤,這里記錄一下。
不使用GCD方式,創建定時器有這么兩種:
//方式1
timerWithTimeInterval: target:selector:userInfo:repeats:
//方式2
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
1.聲明定時器
@property (nonatomic, strong) NSTimer *myTimer;
2.初始化
第一種方式初始化定時器:
_myTimer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(timerTarget) userInfo:nil repeats:YES];
這種方式,只是創建了定時器,但并未將其添加到主循環中,并不會執行target方法。
需要手動將其添加到主循環中:
[[NSRunLoop mainRunLoop] addTimer:_myTimer forMode:NSDefaultRunLoopMode];
第二種方式初始化定時器:
_myTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(timerTarget) userInfo:nil repeats:YES];
第二種方式是創建的同時將定時器添加到了主循環,不需要再手動添加到主循環。
Interval:為每隔多少秒執行一次selector事件
target:指向對象
selector:目標執行事件
repeats:是否重復
若repeats:為NO 則僅執行一次就結束。
若repeats:為YES 才會每隔指定的時間執行一次selector事件。
若想要定時器事件馬上開始執行,則添加代碼:
//立即開始
[_myTimer setFireDate:[NSDate distantPast]];
在重復執行的定時器中調用此方法立即觸發該定時器,但不會中斷其之前的執行計劃;即3秒后 又會調用selector方法。
3.取消定時器
[_myTimer invalidate];
_myTimer = nil;
必須要將定時器置為nil,否則并沒銷毀定時器,可能造成內存泄漏。