前言
NSTimer的特性(坑)上篇文章 提到過官硝,基于這些特性(坑),用GCD寫的定時器似乎更好用?
正文
先看API
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, JKGCDTimerState) {
JKGCDTimerStateSuspend = 0,
JKGCDTimerStateResume,
JKGCDTimerStateInvalid
};
@interface JKGCDTimer : NSObject
// default is JKGCDTimerStateSuspend
@property (nonatomic, readonly) JKGCDTimerState state;
@property (nonatomic, readonly) NSTimeInterval interval;
@property (nonatomic, strong, readonly) id userInfo;
@property (nonatomic, readonly) BOOL repeats;
@property (nonatomic, copy, readonly) void(^block)(JKGCDTimer *);
// default is mainQueue
+ (instancetype)timerWithTimeInterval:(NSTimeInterval)interval
userInfo:(id)userInfo
repeats:(BOOL)repeats
block:(void (^)(JKGCDTimer *timer))block;
+ (instancetype)timerWithTimeInterval:(NSTimeInterval)interval
userInfo:(id)userInfo
repeats:(BOOL)repeats
queue:(dispatch_queue_t)queue
block:(void (^)(JKGCDTimer *timer))block;
// default is mainQueue
+ (instancetype)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
userInfo:(id)userInfo
repeats:(BOOL)repeats
block:(void (^)(JKGCDTimer *timer))block;
+ (instancetype)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
userInfo:(id)userInfo
repeats:(BOOL)repeats
queue:(dispatch_queue_t)queue
block:(void (^)(JKGCDTimer *timer))block;
// the following 3 methods are default invoked in the queue
- (void)suspend;
- (void)resume;
- (void)invalidate;
@end
NS_ASSUME_NONNULL_END
接口基本與NSTimer相同喜鼓,簡單說下特性(坑):
1.timerWithTimeInterval
開頭的方法需要手動調(diào)用resume
開啟
2.scheduledTimerWithTimeInterval
開頭的方法默認(rèn)開啟resume
3.可以通過state
屬性獲取當(dāng)前定時器所處狀態(tài)
4.通過userInfo
屬性傳遞參數(shù)
5.在不使用時际乘,需要調(diào)用invalidate
坡倔,可以直接在vc的dealloc方法中調(diào)用,不存在內(nèi)存泄漏
6.repeats
為NO時脖含,可以不手動調(diào)用invalidate
方法罪塔,內(nèi)部默認(rèn)調(diào)用
7.repeats
為YES時,可以通過suspend
和resume
對定時器做暫停养葵、恢復(fù)操作
8.可以通過queue
設(shè)置定時器工作所在隊(duì)列
9.當(dāng)queue
不是主隊(duì)列征堪,suspend resume invalidate
這3個方法可以直接調(diào)用,內(nèi)部已經(jīng)切換到指定隊(duì)列关拒,不需要手動切換
這里是源碼
隨手寫的佃蚜,不保證質(zhì)量庸娱,僅供參看,歡迎指正
Have fun谐算!