【iOS 開發(fā)】延遲執(zhí)行方法小總結(jié)

當(dāng)需要實現(xiàn)類似“輪詢”這種操作的時候,我們可能會希望有一個“被放緩了的” for 循環(huán) —— 即當(dāng)某次操作執(zhí)行后哈街,稍等一下再去執(zhí)行下一次操作。這時有幾種方法可以供我們使用,來實現(xiàn)這種效果坷虑,下面對比總結(jié)一下。


perform(_ aSelector: Selector, with anArgument: Any?, afterDelay delay: TimeInterval)

extension NSObject {
    open func perform(_ aSelector: Selector, with anArgument: Any?, afterDelay delay: TimeInterval, inModes modes: [RunLoopMode])
    open func perform(_ aSelector: Selector, with anArgument: Any?, afterDelay delay: TimeInterval)
    open class func cancelPreviousPerformRequests(withTarget aTarget: Any, selector aSelector: Selector, object anArgument: Any?)
    open class func cancelPreviousPerformRequests(withTarget aTarget: Any)
}

extension RunLoop {
    open func perform(_ aSelector: Selector, target: Any, argument arg: Any?, order: Int, modes: [RunLoopMode])
    open func cancelPerform(_ aSelector: Selector, target: Any, argument arg: Any?)
    open func cancelPerformSelectors(withTarget target: Any)
}

這是系統(tǒng)提供的 API埂奈,其中最簡單的第 2 個方法可以通過指定方法迄损、參數(shù)、延遲時間來實現(xiàn)延遲調(diào)用账磺。

優(yōu)點:使用簡單芹敌、自帶根據(jù) target 取消調(diào)用的機(jī)制 并且可以指定對象、方法來取消延遲調(diào)用 使得這個方法可以完成一些復(fù)雜的延遲調(diào)用機(jī)制
缺點:系統(tǒng)幫你自動完成了很多操作垮抗,使得它不像定時器(NSTimer)那樣高度可控党窜。


scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) -> Timer

open class Timer : NSObject {
    public /*not inherited*/ init(timeInterval ti: TimeInterval, invocation: NSInvocation, repeats yesOrNo: Bool)
    open class func scheduledTimer(timeInterval ti: TimeInterval, invocation: NSInvocation, repeats yesOrNo: Bool) -> Timer
    public /*not inherited*/ init(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool)
    open class func scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) -> Timer
}

通過常見的定時器也可以實現(xiàn)延遲調(diào)用,把 repeats 參數(shù)置為 false借宵,可以實現(xiàn)類似上面的 perform 的效果。

優(yōu)點:定時器狀態(tài)可控矾削,可以重新賦值壤玫,可以查看是否 valid 等
缺點:對比上面的 perform 方法可以直接傳參,這里想要傳參的話只能曲線救國:

  1. 把參數(shù)放在 timer 的 userInfo 里面哼凯,再把 timer 本身當(dāng)成參數(shù)傳遞(這里使得代碼可讀性稍稍變差欲间,但是好在 userInfo 里面什么都能放,這使得我們可以同時傳遞多個參數(shù)了)
  2. 如果你的代碼可以不兼容 iOS 10 以下的系統(tǒng)断部,新的 API 可以讓你不通過 selector 而是通過 block (closure) 執(zhí)行代碼

asyncAfter(deadline: DispatchTime, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping @convention(block) () -> Swift.Void)

DispatchQueue.main.asyncAfter(wallDeadline: DispatchWallTime.now() + 1, execute: {
    print("1 second after")
})

上面這段代碼猎贴,可以在 1 秒之后,通過主線程執(zhí)行 print。值得注意的是她渴,設(shè)定時間的時候达址,有兩種類型,一種是 DispatchTime趁耗,這個時間本質(zhì)上是相對時間沉唠,它會在系統(tǒng)休眠的時候暫停,另外一種是 DispatchWallTime苛败,這個時間正如其名满葛,是“墻上的掛鐘時間”,是絕對時間罢屈,比如你可能希望某一個任務(wù)準(zhǔn)確地在x小時嘀韧、x分鐘、x秒之后執(zhí)行缠捌,這段時間可能發(fā)生任何事情锄贷,這時推薦使用 DispatchWallTime.

神奇而偉大的 GCD 這里就不多做介紹了,有太多文章講解它了
優(yōu)點:執(zhí)行的是閉包鄙币,可以隨意傳參
缺點:一旦開啟肃叶,無法取消,只能提前在閉包里面添加嚴(yán)謹(jǐn)?shù)倪壿嬇袛嗔?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末十嘿,一起剝皮案震驚了整個濱河市因惭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绩衷,老刑警劉巖蹦魔,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咳燕,居然都是意外死亡勿决,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門招盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來低缩,“玉大人,你說我怎么就攤上這事曹货∨胤保” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵顶籽,是天一觀的道長玩般。 經(jīng)常有香客問我,道長礼饱,這世上最難降的妖魔是什么坏为? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任究驴,我火速辦了婚禮,結(jié)果婚禮上匀伏,老公的妹妹穿的比我還像新娘洒忧。我一直安慰自己,他們只是感情好帘撰,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布跑慕。 她就那樣靜靜地躺著,像睡著了一般摧找。 火紅的嫁衣襯著肌膚如雪核行。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天蹬耘,我揣著相機(jī)與錄音芝雪,去河邊找鬼。 笑死综苔,一個胖子當(dāng)著我的面吹牛惩系,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播如筛,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堡牡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杨刨?” 一聲冷哼從身側(cè)響起晤柄,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妖胀,沒想到半個月后芥颈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡赚抡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年爬坑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涂臣。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盾计,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赁遗,到底是詐尸還是另有隱情闯估,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布吼和,位于F島的核電站,受9級特大地震影響骑素,放射性物質(zhì)發(fā)生泄漏炫乓。R本人自食惡果不足惜刚夺,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望末捣。 院中可真熱鬧侠姑,春花似錦、人聲如沸箩做。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邦邦。三九已至安吁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燃辖,已是汗流浹背鬼店。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留黔龟,地道東北人妇智。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像氏身,于是被迫代替她去往敵國和親巍棱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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