iOS開發(fā)——帶有暫停功能的計時器

上篇博客我跟大家分享了如何在iOS系統(tǒng)中使用原生框架獲取步數(shù),又是大半個月過去了,運動模塊的全部功能也總算完成了,也打算有始有終的把如何做一個跑步類App跟大家分享了。

運動類應用中,有一個很重要的模塊就是計時器,當然,這個計時器不算復雜,只要有簡單的開始、暫停以及復位功能即可。那么今天我們從Model層來看看這個計時器的邏輯實現(xiàn)。

我們先自己創(chuàng)建一個時間的Model

class RunningTimer: NSObject {
//MARK: var property
    private var timeLabel: UILabel!
    private var timer: NSTimer?
    //開始和結(jié)束時間列表
    lazy private var startTimes = [NSDate]()
    lazy private var endTimes = [NSDate]()
    
    internal var timeNumber = 0 {
        didSet {
            timeString = getTimeStringFromSecond(timeNumber)
        }
    }
    
    internal private(set) var timeString = "00:00:00" {
        didSet {
            timeLabel.text = timeString
        }
    }


}

先從這段聲明變量的代碼分析開來,首先是定義了一個timeLabel,這個變量主要是為了在初始化時,直接將View層要顯示的Label綁定進來,timer即為一個計時器,順便定義了兩個數(shù)組,用來記錄時間,因為在真實環(huán)境中,可能有若干次暫停,所以用數(shù)組來存儲。timeNumber即為計時器中的總秒數(shù),用SwiftdidSet特性來監(jiān)聽屬性的變化,當秒數(shù)發(fā)送變化時,講秒數(shù)轉(zhuǎn)化成時間的標準格式,并且賦值給timeString,同理,timeString也在屬性發(fā)送變化時,將自己的值賦值給Labeltext屬性用以顯示。

到這里我們的變量講解完畢,接著往下看功能的實現(xiàn)。

    //MARK: - 初始化
    init(timeLabel: UILabel) {
        self.timeLabel = timeLabel
        timeLabel.text = timeString
    }

這是這個Model的初始化,用意一目了然,傳入一個外部Label用以顯示時間。

//計時開始
    func timingStart(){
        startTimes.append(NSDate())
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(self.count), userInfo: nil, repeats: true)
    }
    
    //暫停計時
    func timingPause(){
        endTimes.append(NSDate())
        timer?.invalidate()
    }
    
    //暫停后繼續(xù)計時
    func timingContinue(){
        timingStart()
    }
    
    //重置Timer
    func resetToStart() {
        startTimes = []
        endTimes = []
        timer?.invalidate()
        timeNumber = 0
    }

這里定義了四個方法,對應我們UI界面會出現(xiàn)的Button功能,StartPause、Continue、resetToStart。代碼很簡單,當start時添加當前時間至數(shù)組里,并且啟動定時器,暫停時,銷毀定時器,添加暫停的時間進入暫停數(shù)組。繼續(xù)和重置同理。那么我們來看定時器啟動時,對應的selector做了哪些事情。

//MARK: - 計時器
    private func timeCount(){
        if startTimes.count == 1 {
            let currentTime = NSDate()
            timeNumber = Int(CFDateGetTimeIntervalSinceDate(currentTime, startTimes[0]))
        }else{
            if startTimes.count - endTimes.count == 1 {
                endTimes.append(NSDate())
            }
            let index = startTimes.count - 1
            endTimes[index] = NSDate()
            var timeCount = 0
            for startTime in startTimes{
                timeCount += Int(CFDateGetTimeIntervalSinceDate(endTimes[startTimes.indexOf(startTime)!],startTime))
            }
            timeNumber = timeCount
        }
    }
    
    @objc private func count(){
        timeCount()
    }

當計時器的count()方法運行時、調(diào)用timeCount()方法。
當我們第一次運行計時器時,獲取的秒數(shù)就是開始時間與當前時間比對的差值。
而之后,就是跟暫停之后啟動時間的對比了。
這里面使用public func CFDateGetTimeIntervalSinceDate(theDate: CFDate!, _ otherDate: CFDate!) -> CFTimeInterval函數(shù)獲取兩個時間之間的時間戳差值。
最后再把前面那個秒數(shù)轉(zhuǎn)格式化時間的方法也貼出來吧。

//從以秒計時的時間里獲得表示時間的字符串用于顯示
func getTimeStringFromSecond(seconds: Int) -> String {
    
    let secondNumber = seconds % 60
    let minuteNumber = (seconds / 60) % 60
    let hourNumber = (seconds / (60*60)) % 24
    
    let secondText = secondNumber < 10 ? "0\(secondNumber)" : "\(secondNumber)"
    let minuteText = minuteNumber < 10 ? "0\(minuteNumber)" : "\(minuteNumber)"
    let hourText = hourNumber < 10 ? "0\(hourNumber)" : "\(hourNumber)"
    
    return "\(hourText):\(minuteText):\(secondText)"
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,909評論 25 709
  • 本是靈珠降陳塘 人間哪識得,好兒郎 一劍劈開見圣嬰 授得太乙真?zhèn)?,便有滔天本領 東海一戰(zhàn),千古留名 剝皮抽筋 哪里...
    飛狐119閱讀 373評論 2 2
  • 隔壁宿舍的 一位同學 和我在校園餐廳 吃飯的時候 告訴我: 從來沒有一個學校 像這個大學 讓我睡覺 睡到頭疼 20...
    道聽途LC閱讀 207評論 0 0
  • 領導叫你去,那是對你的信任。 吃飯比干活強。應該清醒的認識到。 很多事情都是一瞬間的抉擇。抉擇錯誤就很難改正過來了...
    當?shù)?/span>閱讀 794評論 0 0

友情鏈接更多精彩內(nèi)容