Swift開發(fā)DispatchSourceTimer倒計時

倒計時是個很常用的東西拯辙,創(chuàng)建倒計時要把計時器放入到runloop 當(dāng)中眠饮,因為計時器也是一種資源禽绪,資源只有放入到runloop當(dāng)中才能起作用猾骡。創(chuàng)建計時器的方法有好幾種:
1,NSTimer 在swift當(dāng)中沒有NS直接Timer進(jìn)行創(chuàng)建
2蚜印,CADisplayLink以屏幕刷新幀率結(jié)束進(jìn)行觸發(fā)計時操作莺禁,精準(zhǔn)度比較高
3,DispatchSourceTimer 利用GCD進(jìn)行創(chuàng)建計時器窄赋,系統(tǒng)默認(rèn)進(jìn)行重復(fù)操作
因為計時器是這玩意很容易出現(xiàn)線程的問題哟冬,而且處理不當(dāng)會直接影響性能和用戶的體驗方面楼熄,所以推薦使用GCD來創(chuàng)建計時器,這里是以swift為例簡單介紹一下浩峡。

倒計時.gif
創(chuàng)建計時器
var time = DispatchSource.makeTimerSource()
//倒計時的總時間 初始值自己填寫
 var times = TimeInterval()  
//repeating代表間隔1秒 
time.schedule(deadline: .now(), repeating: 1)
        time.setEventHandler(handler: {
            if self.times<0{
                self.time.cancel()
            }else {
                DispatchQueue.main.async {
                    self.button.setTitle(self.returnTimeTofammater(times: self.times), for: .normal)
                    self.times-=1
                }
            }
        })

 //點擊開始倒計時
    @objc func starAction(sender:UIButton){
        if sender.isSelected == true {
            time.suspend()
            sender.setTitle("暫停", for: .normal)
        }else{
            time.resume()
        }
        sender.isSelected = !sender.isSelected
    }
介紹兩個方法可岂,一個是將TimeInterval類型的值轉(zhuǎn)為字符串
 //將多少秒傳進(jìn)去得到00:00:00這種格式
    func returnTimeTofammater(times:TimeInterval) -> String {
        if times==0{
            return "00:00:00"
        }
        var Min = Int(times / 60)
        let second = Int(times.truncatingRemainder(dividingBy: 60));
        var Hour = 0
        if Min>=60 {
            Hour = Int(Min / 60)
            Min = Min - Hour*60
            return String(format: "%02d : %02d : %02d", Hour, Min, second)
        }
        return String(format: "00 : %02d : %02d", Min, second)
    }
一個是將字符串類型的值轉(zhuǎn)為int數(shù)字
//根據(jù)顯示的字符串00:00:00轉(zhuǎn)化成秒數(shù)
    func getSecondsFromTimeStr(timeStr:String) -> Int {
        if timeStr.isEmpty {
            return 0
        }
        let timeArry = timeStr.replacingOccurrences(of: ":", with: ":").components(separatedBy: ":")
        var seconds:Int = 0
        if timeArry.count > 0 && isPurnInt(string: timeArry[0]){
            let hh = Int(timeArry[0])
            if hh! > 0 {
                seconds += hh!*60*60
            }
        }
        if timeArry.count > 1 && isPurnInt(string: timeArry[1]){
            let mm = Int(timeArry[1])
            if mm! > 0 {
                seconds += mm!*60
            }
        }
        if timeArry.count > 2 && isPurnInt(string: timeArry[2]){
            let ss = Int(timeArry[2])
            if ss! > 0 {
                seconds += ss!
            }
        }
        return seconds   
    }
    //掃描字符串的值
    func isPurnInt(string: String) -> Bool {
        let scan:Scanner = Scanner.init(string: string)
        var val:Int = 0
        return scan.scanInt(&val) && scan.isAtEnd
    }

說到這里基本的就完了,自己可以動手試一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翰灾,一起剝皮案震驚了整個濱河市缕粹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纸淮,老刑警劉巖平斩,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咽块,居然都是意外死亡绘面,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門糜芳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飒货,“玉大人,你說我怎么就攤上這事峭竣√粮ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵皆撩,是天一觀的道長扣墩。 經(jīng)常有香客問我,道長扛吞,這世上最難降的妖魔是什么呻惕? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮滥比,結(jié)果婚禮上亚脆,老公的妹妹穿的比我還像新娘。我一直安慰自己盲泛,他們只是感情好濒持,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寺滚,像睡著了一般柑营。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上村视,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天官套,我揣著相機(jī)與錄音,去河邊找鬼。 笑死奶赔,一個胖子當(dāng)著我的面吹牛惋嚎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纺阔,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瘸彤,長吁一口氣:“原來是場噩夢啊……” “哼修然!你這毒婦竟也來了笛钝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤愕宋,失蹤者是張志新(化名)和其女友劉穎玻靡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體中贝,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡囤捻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了邻寿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎土。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绣否,靈堂內(nèi)的尸體忽然破棺而出誊涯,到底是詐尸還是另有隱情,我是刑警寧澤蒜撮,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布暴构,位于F島的核電站,受9級特大地震影響段磨,放射性物質(zhì)發(fā)生泄漏取逾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一苹支、第九天 我趴在偏房一處隱蔽的房頂上張望砾隅。 院中可真熱鬧,春花似錦债蜜、人聲如沸晴埂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑时。三九已至,卻和暖如春特姐,著一層夾襖步出監(jiān)牢的瞬間晶丘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留浅浮,地道東北人沫浆。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像滚秩,于是被迫代替她去往敵國和親专执。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,334評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,090評論 1 32
  • 素材這個東西果然是越用越少的郁油。我感覺要江郎才盡了本股。 最近比較火的劇應(yīng)該就是楚喬傳了。這部劇看宣傳看宣傳片看陣容神馬...
    奶味冰咖燕子閱讀 149評論 2 1
  • 昨天晚上去參加晚宴桐腌,遇到了很多親戚拄显,當(dāng)時在想,我們的下一代大多是獨生子女案站,將來他們沒有姨躬审,表親,所以就多喝了酒蟆盐,今...
    清風(fēng)1970閱讀 132評論 0 1
  • 君生我未生承边,我生君已老。 君生我未生,我生君已老 君恨我生遲石挂,我恨君生早博助。 君生我未生,我生君已老誊稚。 恨不...
    南山之木閱讀 321評論 0 0