最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解iOS 用于解決循環(huán)引用的block timer

 更新時間:2018年12月13日 09:46:04   作者:無夜之星辰  
這篇文章主要介紹了詳解iOS 用于解決循環(huán)引用的block timer,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、什么是回調函數(shù)?

回調函數(shù),本質上也是個函數(shù)(擱置函數(shù)和方法的爭議,就當這二者是一回事)。由“聲明”、“實現(xiàn)”、“調用”三部分組成。

在上面的例子中,我可以看出,函數(shù)amount(其實是Block),的聲明和調用在A類中,而實現(xiàn)部分在B類中。也就是說,B類實現(xiàn)了amount函數(shù),但并沒有權限調用,最終還是 由A類觸發(fā)調用。我們稱這樣的機制為“回調”。意思是“雖然函數(shù)的實現(xiàn)寫在B類中,但是真正的調用還是得由A類來完成。”正常函數(shù)“函數(shù)聲明、實現(xiàn)均在一個類中完成?!?/p>

一句大白話理解“回調”的概念:“函數(shù)的實現(xiàn)部分雖然不在老家(A類),但是最終的調用還是由老家人完成”,這樣的函數(shù)就叫做回調函數(shù)。“老家人調用你,就叫回調,因為你本來就屬于老家。

用《無間道》理解“回調函數(shù)”概念:

香港警務處(類):

招聘了一名警察張三(聲明函數(shù)),并培養(yǎng)、訓練他(實現(xiàn)函數(shù))。

招聘了一名警察陳仁貴(聲明函數(shù)),但并沒有培養(yǎng)他,而是被送進了三合會。但有任務的時候,警務處會調用陳仁貴(回調函數(shù))。

廉政總署(類):使用警務處的張三(普通調用)。

三合會(類):培養(yǎng)、訓練陳仁貴(實現(xiàn)函數(shù))。

第二個問題:什么情況下使用回調函數(shù)?

假設有A、B兩個類。

(1)A類有多種形態(tài),要在B類中實現(xiàn)回調函數(shù)。如假設A類是網(wǎng)絡請求開源類ASIHttpRequest,它可能請求成功,也可能請求失敗。這個時候,B類就要針對以上兩個情況,作不同的處理。

(2)A類的形態(tài)由B類決定時,要在B類中實現(xiàn)回調函數(shù)。如UITableView類就會提供很多回調函數(shù)(iOS專業(yè)術語稱“委托”方法)

(3)A類需要向B類傳遞數(shù)據(jù)時,可以在B類中實現(xiàn)回調函數(shù)(A類一般是數(shù)據(jù)層比較耗時的操作類)。如舉的那個發(fā)工資的例子。在實際編程中,這樣的機制有個好處就是可以提升用戶的操作體驗。比如用戶從X頁面跳轉到Y頁面,需要向網(wǎng)絡請求數(shù)據(jù),而且比較耗時,那我們怎么辦?有三種方案:第一種就是在X頁面展示一個旋轉指示器,當收到網(wǎng)絡傳回的數(shù)據(jù)時,在展現(xiàn)Y頁面。第二種就是使用回調函數(shù)。用戶從X頁面直接跳轉到Y頁面,Y頁面需要到數(shù)據(jù)讓數(shù)據(jù)層去執(zhí)行,當收到數(shù)據(jù)時,再在Y頁面展現(xiàn)。第三種就是在Y頁面中開啟多線程。讓一個子線程專門到后臺去取數(shù)據(jù)。綜合來說,第二種更加簡介易懂,而且代碼緊湊。

第三個問題:使用回調函數(shù)有什么好處?

(1)可以讓實現(xiàn)方,根據(jù)回調方的多種形態(tài)進行不同的處理和操作。(ASIHttpRequest)

(2)可以讓實現(xiàn)方,根據(jù)自己的需要定制回調方的不同形態(tài)。(UITableView)

(3)可以將耗時的操作隱藏在回調方,不影響實現(xiàn)方其它信息的展示。

(4)讓代碼的邏輯更加集中,更加易讀。

什么是回調函數(shù)?——就是由聲明函數(shù)的類來調用的函數(shù)叫做回調函數(shù)。普通函數(shù)可以讓任何類調用。

“回調”的主語是誰?——聲明“回調函數(shù)”的那個類。

Block、委托、通知、回調函數(shù),它們雖然名字不一樣,但是原理都一樣,都是“回調機制”的思想的具體實現(xiàn)!

iOS 10的時候NSTimer新增了一個帶block的API:

復制代碼 代碼如下:
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

蘋果的官方文檔里說,將這個timer本身作為參數(shù)傳給block以此來避免循環(huán)引用:

/// - parameter:  block  The execution body of the timer; the timer itself is passed as the parameter to this block when executed to aid in avoiding cyclical references

有了這個API再也不需要繁瑣的手動注銷timer,結合weakSelf就可以輕松處理循環(huán)引用,如:

__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
  __strong typeof(self) strongSelf = weakSelf;
  [strongSelf printNum];
}];

在這個API出現(xiàn)之前,self和timer的引用關系是:self->timer->self

現(xiàn)在的引用關系是:self->timer->weakSelf

但是只有iOS 10及之后的系統(tǒng)才能使用此API,而我們一般都是適配到iOS 8,所以有必要擴展一下。

如何擴展?

簡單點,寫個category,直接復制蘋果的API進去(思考API設計的時間都省了😎),然后加上前綴:

+ (NSTimer *)cq_scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block {
  return [self scheduledTimerWithTimeInterval:interval target:self selector:@selector(cq_callBlock:) userInfo:[block copy] repeats:repeats];
}

+ (void)cq_callBlock:(NSTimer *)timer {
  void (^block)(NSTimer *timer) = timer.userInfo;
  !block ?: block(timer);
}

你不是把timer作為參數(shù)傳給block嗎?那我也這樣搞。

然后就可以像使用系統(tǒng)API那樣使用了:

__weak typeof(self) weakSelf = self;
self.timer = [NSTimer cq_scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer *timer) {
  __strong typeof(self) strongSelf = weakSelf;
  [strongSelf printNum];
}];

最后提供一個此timer使用的具體demo:https://github.com/CaiWanFeng/CQCountDownButton

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 詳解iOS Project和Targets配置

    詳解iOS Project和Targets配置

    本篇文章給大家分享了一篇關于在IOS中配置Project和Targets的相關文章,有這方面需要的朋友參考下吧。
    2018-01-01
  • 老生常談iOS應用程序生命周期

    老生常談iOS應用程序生命周期

    下面小編就為大家?guī)硪黄仙U刬OS應用程序生命周期。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 值得收藏的iOS開發(fā)常用代碼塊

    值得收藏的iOS開發(fā)常用代碼塊

    這篇文章主要為大家詳細介紹了iOS開發(fā)常用代碼塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • iOS動態(tài)驗證碼實現(xiàn)代碼

    iOS動態(tài)驗證碼實現(xiàn)代碼

    本文通過實例代碼給大家介紹了ios動態(tài)驗證碼的實現(xiàn)方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-04-04
  • 一行iOS代碼實現(xiàn)圖片無限輪播器

    一行iOS代碼實現(xiàn)圖片無限輪播器

    一行iOS代碼實現(xiàn)圖片無限輪播器的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • iOS開發(fā)中常用的各種動畫、頁面切面效果

    iOS開發(fā)中常用的各種動畫、頁面切面效果

    這篇文章主要介紹了iOS開發(fā)中常用的各種動畫、頁面切面效果 的相關資料,需要的朋友可以參考下
    2016-04-04
  • IOS11新特性與兼容適配

    IOS11新特性與兼容適配

    iOS 11正式發(fā)布了,下面整理了一些該版本下的特點還有如何進行兼容適配工作需要做的事情,希望能夠給你提供到幫助。
    2017-11-11
  • iOS模仿電子書首頁實現(xiàn)書架布局樣式

    iOS模仿電子書首頁實現(xiàn)書架布局樣式

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)類似電子書首頁效果樣式,實現(xiàn)書架布局樣式,感興趣的小伙伴們可以參考一下
    2016-03-03
  • iOS 圖片加載框架SDWebImage解讀

    iOS 圖片加載框架SDWebImage解讀

    本篇文章主要介紹了iOS 圖片加載框架SDWebImage解讀,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • iOS自定義轉場動畫的幾種情況

    iOS自定義轉場動畫的幾種情況

    這篇文章主要給大家介紹了關于iOS自定義轉場動畫的幾種情況,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06

最新評論

榆树市| 格尔木市| 南城县| 虎林市| 同德县| 松原市| 兴义市| 高邑县| 仙桃市| 九龙县| 麻栗坡县| 翼城县| 黑山县| 高台县| 禄丰县| 集安市| 澄迈县| 福建省| 昌都县| 龙州县| 文安县| 景德镇市| 贞丰县| 深水埗区| 临洮县| 林周县| 阳高县| 平凉市| 汉阴县| 宁都县| 鹤壁市| 恩平市| 尼勒克县| 抚松县| 衡山县| 会东县| 东阿县| 屏山县| 蛟河市| 纳雍县| 梁山县|