iOS中blocktimer有什么用

小編給大家分享一下iOS中block timer有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)是專(zhuān)業(yè)的宣恩網(wǎng)站建設(shè)公司,宣恩接單;提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行宣恩網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

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

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

在上面的例子中,我可以看出,函數(shù)amount(其實(shí)是Block),的聲明和調(diào)用在A類(lèi)中,而實(shí)現(xiàn)部分在B類(lèi)中。也就是說(shuō),B類(lèi)實(shí)現(xiàn)了amount函數(shù),但并沒(méi)有權(quán)限調(diào)用,最終還是 由A類(lèi)觸發(fā)調(diào)用。我們稱(chēng)這樣的機(jī)制為“回調(diào)”。意思是“雖然函數(shù)的實(shí)現(xiàn)寫(xiě)在B類(lèi)中,但是真正的調(diào)用還是得由A類(lèi)來(lái)完成?!闭:瘮?shù)“函數(shù)聲明、實(shí)現(xiàn)均在一個(gè)類(lèi)中完成?!?/p>

一句大白話(huà)理解“回調(diào)”的概念:“函數(shù)的實(shí)現(xiàn)部分雖然不在老家(A類(lèi)),但是最終的調(diào)用還是由老家人完成”,這樣的函數(shù)就叫做回調(diào)函數(shù)?!袄霞胰苏{(diào)用你,就叫回調(diào),因?yàn)槟惚緛?lái)就屬于老家。

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

香港警務(wù)處(類(lèi)):

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

招聘了一名警察陳仁貴(聲明函數(shù)),但并沒(méi)有培養(yǎng)他,而是被送進(jìn)了三合會(huì)。但有任務(wù)的時(shí)候,警務(wù)處會(huì)調(diào)用陳仁貴(回調(diào)函數(shù))。

廉政總署(類(lèi)):使用警務(wù)處的張三(普通調(diào)用)。

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

第二個(gè)問(wèn)題:什么情況下使用回調(diào)函數(shù)?

假設(shè)有A、B兩個(gè)類(lèi)。

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

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

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

第三個(gè)問(wèn)題:使用回調(diào)函數(shù)有什么好處?

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

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

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

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

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

“回調(diào)”的主語(yǔ)是誰(shuí)?——聲明“回調(diào)函數(shù)”的那個(gè)類(lèi)。

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

iOS 10的時(shí)候NSTimer新增了一個(gè)帶block的API:

復(fù)制代碼 代碼如下:

+ (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));

蘋(píng)果的官方文檔里說(shuō),將這個(gè)timer本身作為參數(shù)傳給block以此來(lái)避免循環(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

有了這個(gè)API再也不需要繁瑣的手動(dòng)注銷(xiāo)timer,結(jié)合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];
}];

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

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

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

如何擴(kuò)展?

簡(jiǎn)單點(diǎn),寫(xiě)個(gè)category,直接復(fù)制蘋(píng)果的API進(jìn)去(思考API設(shè)計(jì)的時(shí)間都省了?),然后加上前綴:

+ (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];
}];

以上是“iOS中block timer有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁(yè)題目:iOS中blocktimer有什么用
分享網(wǎng)址:http://muchs.cn/article32/ghedpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、軟件開(kāi)發(fā)用戶(hù)體驗(yàn)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司