- 日常開發(fā)中延刘,使用到定時器都需要手動去釋放树灶,不僅麻煩還容易出錯工闺,所以現(xiàn)在我們來設計一個可以自動釋放的定時器嚷硫。
現(xiàn)在開始
- 以下是定時器(
Timer
)創(chuàng)建的一個常用方法仔粥,下面我們就根據(jù)這個方法來設計可以自動釋放的定時器崎场。
open class func scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) -> Timer
1.自動釋放的假想
- 當每次執(zhí)行
selector
方法的時候放仗,我們就判斷定時器的持有者taeget
是否存在留夜,如果不存在崎脉,則銷毀定時器拧咳。 - 在定時器中,我們無法判斷
target
是否存在囚灼,所以我們就創(chuàng)建一個中介target
骆膝,保存原來的target
,在這個中介target
做一個判斷的邏輯灶体。
2.中介Target
typealias TimerBlock = () -> Swift.Void
class TimerTarget: NSObject {
weak var target: AnyObject?
var timer: Timer?
var name: String?
var block: TimerBlock?
/// 初始化
init(target aTarget: AnyObject?, name aName: String?, block aBlock: TimerBlock?)
{
target = aTarget as AnyObject
name = aName
block = aBlock
}
convenience override init() {
self.init(target: nil, name: nil, block: nil)
}
@objc func aiewing()
{
guard let _ = self.target,
let block = self.block else {
self.timer?.invalidate()
self.timer = nil
guard let name = self.name else {
return
}
print("Timer called \(name) has been invalidated")
return
}
// 執(zhí)行block
block()
}
}
-
這個
中介target
最主要需要保存3個變量阅签。-
target
:這個是自動釋放的關鍵所在,修飾詞一定要使用weak
蝎抽,修飾詞一定要使用weak
政钟,修飾詞一定要使用weak
,不然會造成循環(huán)引用,導致定時器依舊不能自動釋放养交。 -
timer
:這個定時器創(chuàng)建的實例變量精算,需要使用它控制定時器邏輯。 -
block
:這個block
是用來響應外部定時器執(zhí)行的方法的碎连,所以也是需要的灰羽。
-
在方法
aiewing()
中,我們先判斷target
是否存在鱼辙,如果存在就執(zhí)行block
廉嚼,如果不存在就釋放定時器。
3.Timer類擴展
extension Timer
{
class func scheduledTimerAutoToRelease(timeInterval ti: TimeInterval, target aTarget: AnyObject, name aName: String, userInfo aUserInfo: Any?, repeats yesOrNo: Bool, block aBlock: @escaping TimerBlock) -> Timer
{
let timerTarget: TimerTarget = TimerTarget(target: aTarget, name: aName, block: aBlock)
let timer: Timer = Timer.scheduledTimer(timeInterval: ti, target: timerTarget, selector: #selector(timerTarget.aiewing), userInfo: aUserInfo, repeats: yesOrNo)
timerTarget.timer = timer
return timer
}
}
- 先創(chuàng)建一個
中介target
倒戏,然后把中介target
作為定時器的持有者怠噪,最后把定時器實例傳遞到中介target
。
結束
- 以上就是一個簡單可以自動釋放的定時器Demo峭梳。
- 謝謝閱讀