- 今天封装一个无限轮播图,再次被Timer坑在了无限循环里。
- 在3.0中Timer的创建和使用是这样的
-
fileprivate var cycleTimer : Timer? cycleTimer = Timer(timeInterval: 3.0, target: self, selector: #selector(anyStrings), userInfo: nil, repeats: true) RunLoop.main.add(cycleTimer!, forMode: .commonModes)
通常我们会和OC一样在deinit{}函数中这样干
cycleTimer?.invalidate()//移除 cycleTimer = nil
不要以为这样做就万事大吉。当你pop回到上个界面的时候,你会发现你Timer仍在计时,这不难发现,一般我们会打印计时数字。由此我们想到程序压根就没有走deinit{}函数,我们写好的两行代码也不会执行。
-
解决办法:
-
你可以在使用这个View的控制器中,在视图进入后台前对Timer进行销毁操作。(不符合低耦合)
-
优秀的办法:
-
//cycleTimer = Timer(timeInterval: 3.0, target: self, selector: #selector(scrollToNextPage), userInfo: nil, repeats: true) weak var weakSelf = self cycleTimer = Timer(timeInterval: 1, repeats: true, block: {(timer) in weakSelf!.anyString() }) RunLoop.main.add(cycleTimer!, forMode: .commonModes)
这样做过之后,你必须要在deinit{}函数中 销毁计时器,否则你的程序会crash
-
cycleTimer?.invalidate()//移除 cycleTimer = nil
-
-
转载于:https://my.oschina.net/yuluZhang/blog/779795