定時(shí)器需求
先說需求我們需要一個(gè)定時(shí)器崔泵,包含開啟秒赤,暫停,恢復(fù)憎瘸,關(guān)閉入篮。線程安全
并且不需要管理他的內(nèi)存,無論在什么狀態(tài)只要持有他的self釋放了幌甘,這個(gè)定時(shí)器也要跟著釋放潮售。
約定
當(dāng)定時(shí)器 開啟后 只可以 暫停 和 關(guān)閉
當(dāng)定時(shí)器 關(guān)閉后 只可以 重新開啟
當(dāng)定時(shí)器 暫停后 只可以 恢復(fù)
當(dāng)定時(shí)器 恢復(fù)后 只可以 暫停 和 關(guān)閉
注意事項(xiàng)
1. dispatch_source_set_event_handler 回調(diào)是一個(gè)block痊项,所以很容易會(huì)出現(xiàn)循環(huán)引用問題。
使用的時(shí)候記得加__weak
2.關(guān)于dispatch_suspend與dispatch_resume
dispatch_suspend 是將定時(shí)器暫停酥诽,dispatch_resume是恢復(fù)定時(shí)器鞍泉。
官方注釋
Calls to dispatch_suspend() must be balanced with calls
to dispatch_resume().
你調(diào)用了suspend(暫停)幾次,你想resume(恢復(fù))的話肮帐,就必須要remuse(恢復(fù))幾次咖驮,才能繼續(xù)運(yùn)行。
但remuse(恢復(fù))的狀態(tài)下训枢,如果再進(jìn)行一次resume(恢復(fù))就會(huì)crash托修,所以要注冊(cè)一個(gè)BOOL值的狀態(tài)進(jìn)行記錄,防止多次suspend和resume引起閃退恒界。
并且在suspend(暫停)的狀態(tài)下睦刃,如果你設(shè)置_timer = nil就會(huì)crash
自己寫的DEMO:https://github.com/YBYHunter/YUTimer