基于其他高級(jí)語(yǔ)言(如java),swift3.0對(duì)OC中的許多類(lèi)名進(jìn)行了省略,如CGFloat變成Float,NSURL變成了URL,NSURLRequest變成URLRequest,NSTimer變成了Timer,dipatch_time_t變成DispatchQueue......如此的調(diào)整,個(gè)人推測(cè)是為了增加Swift的應(yīng)用范圍(傳言的swift開(kāi)發(fā)有機(jī)會(huì)晉升為全棧工程師也并非沒(méi)有可能).前途是光明的,道路的曲折卻需要填很多坑.下面記錄一下工程在向Swift3.0遷移的過(guò)程中,遇到的NSTimer和GCD應(yīng)用的問(wèn)題
1Timer的啟用和暫停
在UIView的子類(lèi),如UITableViewCell中,可以用懶加載的方式創(chuàng)建Timer:
lazy var timer: Timer = Timer.scheduledTimer(timeInterval: homeRefreshInterval, target: self, selector: #selector(timerFire), userInfo: nil, repeats: true)
啟用和暫停如下:
//啟用
cellTimer?.fireDate = NSDate.distantPast
//暫停
cellTimer?.fireDate = NSDate.distantFuture
而在UIViewController的子類(lèi)中,用懶加載的方式創(chuàng)建Timer時(shí),會(huì)導(dǎo)致通不過(guò)編譯(推測(cè)原因需要保證在主線程創(chuàng)建View頁(yè)面完成后,才可以使用Timer).一般實(shí)現(xiàn)方式如下:
var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
self.timer = Timer.scheduledTimer(timeInterval: refreshTimeInterval, target: self, selector: #selector(loadData), userInfo: nil, repeats: true)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
timer?.fireDate = NSDate.distantPast
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
timer?.fireDate = NSDate.distantFuture
}
2GCD實(shí)現(xiàn)延遲
//延遲后在主線程刷新UI
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
self.aIV.stopAnimating()
self.navigationItem.rightBarButtonItem = self.refreshImage
}
在stackOverFlow中看到的使用方式如下:
var mDispatchQuquq: DispatchQueue?
var mDispatchWorkItem: DispatchWorkItem?
override func viewDidLoad() {
super.viewDidLoad()
self.mDispatchQuquq = DispatchQueue.global(qos: .background)// create Dispatch queue
self.mDispatchWorkItem = DispatchWorkItem {//ceate dispatch item
// TO DO... asinc code
print("uptimeNanoseconds")
}
if self.mDispatchWorkItem != nil {
// launcher .asyncAfter
self.mDispatchQuquq?.asyncAfter(deadline: .now() + .seconds(3),
execute: self.mDispatchWorkItem!)
}
}
swift3.0對(duì)類(lèi)名的變化的同時(shí),伴隨著使用方式的改變,使用的過(guò)程中免不了看官方文檔,查看StackOverFlow等論壇.相信以后問(wèn)題還有很多,但同時(shí)也意味著解決問(wèn)題之后的進(jìn)步,加油!