国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

2021-05-18 20:12青玉伏案 IOS

這篇文章主要給大家介紹了關于iOS之UITableView計時器的實現(xiàn)方式,其中包括NSTimer、DispatchSource、CADisplayLink等方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

最近工作比較忙,但是還是出來更新博客了。今天博客中所涉及的內(nèi)容并不復雜,都是一些平時常見的一些問題,通過這篇博客算是對uitableview中使用定時器的幾種方式進行總結(jié)。本篇博客會給出在tableview中使用nstimer或者dispatchsourcer中常見的五種方式。當然下方第一種方式是常規(guī)做法,不過也是uitableview中使用nstimer的一個坑。其他三種方式是為了繞過這個坑的解決方案。

當然,本篇博客共涉及到了uitableview中使用定時器的四種實現(xiàn)方式,當然應該也還有其他實現(xiàn)方式,只不過目前我沒有涉及到。歡迎在評論區(qū)提供其他實現(xiàn)方式,我會及時的整合到目前的demo中。

接下來我們先來總結(jié)一下本篇博客所涉及的四種方式:

  • 第一種就是直接在tableview的cell上使用nstimer,當然這種方式是有問題的,稍后會介紹。
  • 第二種是將nstimer添加到當前線程所對應的runloop中的commonmodes中。
  • 第三種是通過dispatch中的timersource來實現(xiàn)定時器。
  • 第四種是開啟一個新的子線程,將nstimer添加到這個子線程中的runloop中,并使用defaultrunloopmodes來執(zhí)行。
  • 第五種方式就是使用cadisplaylink來實現(xiàn)。

下方我們將會根據(jù)具體的示例來詳細的介紹以上這五種實現(xiàn)方式。

一、在cell中直接使用nstimer

首先我們按照常規(guī)做法,直接在uitableview的cell上添加相應的nstimer, 并使用scheduledtimer執(zhí)行相應的代碼塊。這種方式?jīng)]有什么特殊的就是對timer的直接使用。下方是我們本部分的timer的使用代碼,當然是使用swift來實現(xiàn)的,不過與oc的代碼差不多。代碼如下所示 :

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

上述代碼比較簡單,就是在cell上添加了一個定時器,然后沒1秒更新一次時間,并在cell的timelabel上顯示,運行效果如下所示。從該運行效果中我們不難發(fā)現(xiàn),當我們滑動tableview時,該定時器就停止了工作。具體原因就是當前線程的runloop在tableview滑動時將defaultmode切換到了trackingrunloopmode。因為timer默認是添加在runloop上的defaultmode上的,當mode切換后timer就停止了運行。

但是當停止滑動后,mode又切換了回來,所以timer有可以正常工作了。

  iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

為了進一步看一下mode的切換,我們可以在相應的地方獲取當前線程的runloop并且打印對應的mode。下方代碼就是在tableview所對應的vc上添加的,我們在viewdidload()、viewdidappear()以及scrollviewdidscroll()這個代理方法中對當前線程所對應的runloop下的currentmode進行了打印,其代碼如下。

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

下方就是最終的運行結(jié)果。從輸出結(jié)果中我們不難看出,在viewdidload()方法中打印的current mode為uiinitializationrunloopmode, 從該mode的名字中我們不難發(fā)現(xiàn),該mode負責ui的初始化。在viewdidapperar()方法中,也就是ui顯示后,runloop的mode切換成了kcfrunloopdefaultmode。緊接著,我們?nèi)セ瑒觮ableview,然后在scrollviewdidscroll()代理方法中打印滑動時當前runloop所對應的mode。從下方運行結(jié)果不難看出,當tableview滑動時,打印出的currentmodel為uitrackingrunloopmode。當停止滑動后,點擊show current mode按鈕獲取當前mode時,打印的有時runloopdefaultmode。具體如下所示:

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

二、將timer添加到commonmode中

上一部分的定時器是不能正常運行的,因為nstimer對象默認添加到了當前runloop的defaultmode中,而在切換成trackingrunloopmode時,定時器就停止了工作。解決該問題最直接方法是,將nstimer在trackingrunloopmode中也添加一份。這樣的話無論是在defaultmode還是trackingrunloopmode中,定時器都會正常的工作。

如果你對runloop比較熟悉的話,可以知道commonmodes就是defaultmode和trackingrunloopmode的集合,所以我們只需要將nstimer對象與當前線程所對應的runloop中的commonmodes關聯(lián)即可,具體代碼如下所示:

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

上述代碼與第一部分的代碼不同的地方在于我們將創(chuàng)建好的定時器添加到了當前runloop中的commonmodes中,這樣的話可以保證tableview在滑動時定時器也可以正常運行。上述代碼最終的運行效果如下所示。

  iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

從該運行效果我們不難發(fā)現(xiàn),當該tableview滾動式,其cell上的定時器是可以正常工作的。但是當我們滑動右上角的這個tableview時,第一個的tableview中的定時器也是不能正常工作的,因為這些tableview都在主線程中工作,也就是說這些tableview所在的runloop是同一個。

三、將timer添加到子線程的runloop下的defaultmode中

接下來我們來看另一種解決方案,就是開啟一個新的子線程,然后將timer添加到這個子線程所對應的runloop中。當然因為是子線程的runloop,在添加timer時,我們可以將timer添加到子線程中的runloop中的defaultmode中。添加完畢后,手動運行該runloop。

因為是在子線程中添加的timer, timer肯定是在子線程中工作的,所以在更新ui時,我們需要在主線程中進行更新,具體代碼如下所示:

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

在上述代碼中我們可以看到我們使用全局的并行隊列來異步創(chuàng)建了一個timer對象,然后將該對象添加進了該異步線程中的defaultrunloopmode中,然后運行該runloop。當然在子線程中更新ui還是需要在主線程中去操作的。下方就是上述代碼的運行效果。從該效果中我們不難看出,當滑動tableview時定時器是可以正常工作的。

  iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

四、dispatchtimersource

接下來我們就不使用nstimer來實現(xiàn)定時器了。在之前的博客中聊gcd時其中用到了dispatchtimersource來實現(xiàn)定時器。接下來我們就在tableview的cell上添加dispatchtimersource,然后看一下運行效果。當然下方代碼片段我們是在全局隊列中添加的dispatchtimersource,在主線程中進行更新。當然我們也可以在mainqueue中添加dispatchtimersource,這樣也是可以正常工作的。當然我們不建議在mainqueue中做,因為在編程時盡量的把一些和主線程關聯(lián)不太大的操作放到子線程中去做。代碼如下所示:

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

接下來我們來看一下上述的代碼的運行效果,從該效果中我們可以看出該定時器是可以正常工作的。

  iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

五、cadisplaylink

接下來我們來使用cadisplaylink來實現(xiàn)定時器功能,在之前的博客中我們也使用過cadisplaylink,不過是用來計算fps的。下方代碼片段中我們就使用cadisplaylink來實現(xiàn)的定時器。cadisplaylink可以添加到runloop中,runloop的每一次循環(huán)都會觸發(fā)cadisplaylink所關聯(lián)的方法。在屏幕不卡頓的情況下,每次循環(huán)的時間時1/60秒。

下方代碼,為了不讓屏幕的卡頓等引起的主線程所對應的runloop阻塞所造成的定時器不精確的問題。我們開啟了一個新的線程,并且將cadisplaylink對象添加到這個子線程的runloop中,然后在主線程中更新ui即可。具體代碼如下:

iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

我們對上述代碼運行,下方是其對應的運行結(jié)果。從下方運行結(jié)果中我們不難看出,在tableview滾動時該定時器也是可以正常運行的。當然該方式實現(xiàn)的定時器的精度是比較高的。

  iOS之UITableView計時器的實現(xiàn)方式總結(jié)(NSTimer、DispatchSource、CADisplayLink)

經(jīng)過上述五大部分,我們羅列了定時器的幾種實現(xiàn)方式,通過對比我們不難發(fā)現(xiàn)其優(yōu)劣性。上述定時器中dispatchsourcetime以及cadisplaylink的精度要比nstimer的精度要高。從代碼實現(xiàn)中我們不難看出cadisplaylink的精度是比較高的。

本篇博客所涉及代碼的github分享地址為:https://github.com/lizelu/nstimerwithrunloop

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.cnblogs.com/ludashi/p/7349535.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 一级全黄性色生活片 | 午夜操操 | 波多野结衣一区二区三区中文字幕 | 精品免费国产 | 精品国产欧美一区二区三区成人 | 久久精品中文字幕 | 精品一区二区av | 精品久久久久久久久久久下田 | 亚洲精久久 | av成人在线观看 | 中文字幕一区二区三区四区 | 国产一区中文字幕 | 日韩中文一区二区三区 | 久久久久久亚洲精品中文字幕 | 亚洲欧美视频在线 | 亚洲午夜精品毛片成人播放器 | 国产精品久久久久久中文字 | 国产高清在线精品一区二区三区 | 国产日韩成人 | 91大神xh98hx在线播放 | 日本视频在线 | 久久久香蕉 | 一区二区三区视频免费 | 黄色视屏在线免费观看 | 激情欧美一区二区三区中文字幕 | 亚洲成av人片在线观看无码 | 伊人伊人 | 手机av在线 | 嫩草网站在线观看 | 欧美国产日韩一区 | 无码日韩精品一区二区免费 | 自拍视频在线观看 | 亚洲精品视频在线看 | 欧美一级片免费在线观看 | www.四虎.com| 中文字幕国产日韩 | 亚洲免费在线 | 黄色片网站在线免费观看 | 99精品热 | 色在线免费 | 日韩在线观看一区二区 |