Combine 框架,從0到1 —— 4.在 Combine 中使用計時器

?

本文首發(fā)于 Ficow Shen's Blog,原文地址: Combine 框架吧雹,從0到1 —— 4.在 Combine 中使用計時器

?

內容概覽

  • 前言
  • 使用計時器執(zhí)行周期性的工作
  • 將計時器轉換為計時器發(fā)布者(Timer.TimerPublisher)
  • 總結

?

前言

?

計時器是蘋果開發(fā)者常用的功能涂身。如果你的應用使用 Foundation 框架中的計時器 Timer 來周期性地執(zhí)行某些操作,你可以用 Combine 簡化這些代碼搓蚪。

現(xiàn)在蛤售,讓我們來學習如何使用 Combine 處理計時器,并將已有的計時器處理代碼遷移到 Combine妒潭。

?

使用計時器執(zhí)行周期性的工作

?

對于 iOS 開發(fā)人員而言悴能,以下代碼一定非常眼熟:

var timer: Timer?

override func viewDidLoad() {
    super.viewDidLoad()
    
    timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
        self.myDispatchQueue.async() {
            self.myDataModel.lastUpdated = Date()
        }
    }
}

以上代碼使用 scheduledTimer(withTimeInterval:repeats:block:) 來實現(xiàn)每秒鐘在 myDispatchQueue 中更新 self.myDataModel.lastUpdated 的功能。

?

將計時器轉換為計時器發(fā)布者(Timer.TimerPublisher)

?

要將以上代碼遷移到 Combine雳灾,只需將 TimerscheduledTimer(withTimeInterval:repeats:block:)的返回值) 替換為 Timer.TimerPublisher漠酿。調用 Timer. publish(every:tolerance:on:in:options:) 方法即可創(chuàng)建一個發(fā)布者。

每次底層的計時器(Timer)觸發(fā)時谎亩,發(fā)布者都會發(fā)出一個新的日期(Date)實例炒嘲,該日期代表計時器觸發(fā)的瞬間。然后匈庭,你可以將 Combine 操作符應用到這個日期實例上夫凸,最終將這個發(fā)布者和一個訂閱者(如:sink(receiveValue:)assign(to:on:))連接。

?

由于 Timer.TimerPublisher 遵從 ConnectablePublisher 協(xié)議阱持,因此在您顯式地連接之前夭拌,它不會產(chǎn)生任何元素。為此衷咽,可以通過手動調用 connect() 或使用 autoconnect() 運算符在訂閱者連接時自動連接來實現(xiàn)鸽扁。關于 ConnectablePublisher 的用法,可以參考 這篇文章镶骗。

?

下一個示例將展示如何使用 Timer.TimerPublisher 替換上一個示例桶现。它使用 Combine 的操作符來完成上一個示例中的閉包中的操作:

var cancellable: Cancellable?

override func viewDidLoad() {
    super.viewDidLoad()
    
    cancellable = Timer.publish(every: 1, on: .main, in: .default)
        .autoconnect()
        .receive(on: myDispatchQueue)
        .assign(to: \.lastUpdated, on: myDataModel)
}

在這個例子中,Combine 操作符替換了上一個示例的閉包中的所有行為:

  • receive(on:options:) 操作符確保了后續(xù)操作在指定的調度隊列中執(zhí)行卖词,它替代了前面用到的 async() 調用巩那;
  • assign(to:on:) 操作符通過鍵路徑來更新數(shù)據(jù)模型的 lastUpdated 屬性吏夯;

?

使用 Combine 來簡化你的代碼時,你會發(fā)現(xiàn) Timer.TimerPublisher 會產(chǎn)生新的 Date 實例作為其輸出類型即横。而第一個示例的閉包是將 Timer 本身作為其參數(shù)噪生,因此它必須手動創(chuàng)建新的 Date 實例。

?

總結

?

使用 Combine 來簡化你的計時器代碼時东囚,你會發(fā)現(xiàn):

  • 代碼易讀性明顯提升跺嗽;
  • 線程切換變得更簡單;
  • 數(shù)據(jù)模型的更新可以通過鍵路徑(key path)來簡化页藻;

朋友桨嫁,行動起來吧!把現(xiàn)有項目中的舊代碼重構成使用 Combine 的代碼~

?

推薦繼續(xù)閱讀:Combine 框架份帐,從0到1 —— 4.在 Combine 中使用 KVO

?

本文內容來源:
Replacing Foundation Timers with Timer Publishers

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末璃吧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子废境,更是在濱河造成了極大的恐慌畜挨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噩凹,死亡現(xiàn)場離奇詭異巴元,居然都是意外死亡,警方通過查閱死者的電腦和手機驮宴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門逮刨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堵泽,你說我怎么就攤上這事修己。” “怎么了落恼?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵箩退,是天一觀的道長。 經(jīng)常有香客問我佳谦,道長戴涝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任钻蔑,我火速辦了婚禮啥刻,結果婚禮上,老公的妹妹穿的比我還像新娘咪笑。我一直安慰自己可帽,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布窗怒。 她就那樣靜靜地躺著映跟,像睡著了一般蓄拣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上努隙,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天球恤,我揣著相機與錄音,去河邊找鬼荸镊。 笑死咽斧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的躬存。 我是一名探鬼主播张惹,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岭洲!你這毒婦竟也來了宛逗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盾剩,失蹤者是張志新(化名)和其女友劉穎拧额,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彪腔,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年进栽,在試婚紗的時候發(fā)現(xiàn)自己被綠了德挣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡快毛,死狀恐怖格嗅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情唠帝,我是刑警寧澤屯掖,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站襟衰,受9級特大地震影響贴铜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜瀑晒,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一绍坝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苔悦,春花似錦轩褐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤讽。三九已至,卻和暖如春拗踢,著一層夾襖步出監(jiān)牢的瞬間脚牍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工秒拔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莫矗,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓砂缩,卻偏偏與公主長得像作谚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庵芭,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345