延遲執(zhí)行函數(shù)方法

1.GCD形式

/*ViewController為你當(dāng)前視圖控制器類名**/

__block ViewController ?*weakSelf =self;

/*

*DISPATCH_TIME_NOW:表示從現(xiàn)在開始

*3.0*NSEC_PER_SEC:表示3秒后執(zhí)行(NSEC_PER_SEC,每秒有多少納秒)

**/

dispatch_time_t delayTime =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0*NSEC_PER_SEC));

dispatch_after(delayTime,dispatch_get_main_queue(), ^{

? ? ? ? ? [weakSelf test];

});

注:

/*

*NSEC_PER_SEC疗疟,每秒有多少納秒瑟蜈。

*USEC_PER_SEC,每秒有多少毫秒。(注意是指在納秒的基礎(chǔ)上)

*NSEC_PER_USEC斋攀,每毫秒有多少納秒捐下。

1 * NSEC_PER_SEC 等價(jià)于? 1000 * USEC_PER_SEC? 或? USEC_PER_SEC * NSEC_PER_USEC(每秒的毫秒數(shù)乘以每毫秒的納秒數(shù),也就是每秒的納秒數(shù))

**/

USEC_PER_SEC朵逝,每秒有多少毫秒蔚袍。(注意是指在納秒的基礎(chǔ)上)

NSEC_PER_USEC,每毫秒有多少納秒配名。

2.sleep形式

建議不要采用此種形式啤咽,此種方法是通過阻塞線程的方式執(zhí)行,如果要采用此種方法建議放在子線程中渠脉,否則會(huì)卡住UI界面的執(zhí)行宇整,本人受害過。

sleep(3);//程序停止三秒

//需要執(zhí)行的方法

[self test];

3.定時(shí)器形式(NSTimer)

/*

*userInfo:需要傳遞的數(shù)據(jù)芋膘,可通過NSTimer實(shí)例獲得鳞青,[timer userInfo]霸饲;返回參數(shù)為id類型,強(qiáng)轉(zhuǎn)(NSString*)一下就可以了

repeats:是指定是否循環(huán)執(zhí)行臂拓,YES將循環(huán)厚脉,NO將只執(zhí)行一次

*/

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(test) userInfo:nil repeats:NO];

//第二種創(chuàng)建方法

NSTimer* timer = [NSTimer timerWithTimeInterval:1target:self selector:@selector(test) userInfo: nil ?repeats: NO];

[[NSRunLoopcurrentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

特別注意:使用完之后要記得調(diào)用- (void)invalidate;//停止并刪除

if ( [timer isValid] ?== YES) {

? ? ? ? ? [timer invalidate];

? ? ? ? ? timer=nil;

}//在invalidate之前最好先用isValid先判斷是否還在線程中

注:1. NSTimer與RunLoop有關(guān)(其實(shí)RunLoop與線程是緊密相關(guān)的),RunLoop只能運(yùn)行在一種mode下埃儿,如果要換mode器仗,當(dāng)前的loop也需要停下重啟成新的。利用這個(gè)機(jī)制童番,ScrollView滾動(dòng)過程中NSDefaultRunLoopMode (kCFRunLoopDefaultMode)的mode會(huì)切換到UITrackingRunLoopMode來保證ScrollView的流暢滑動(dòng)精钮;只有在NSDefaultRunLoopMode模式下處理的事件會(huì)影響scrllView的滑動(dòng)。如果我們把一個(gè)NSTimer對(duì)象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運(yùn)行循環(huán)中的時(shí)候, ScrollView滾動(dòng)過程中會(huì)因?yàn)閙ode的切換剃斧,而導(dǎo)致NSTimer將不再被調(diào)度轨香。但是因?yàn)閙ode還是可定制的,所以:Timer計(jì)時(shí)會(huì)被scrollView的滑動(dòng)影響的問題可以通過將timer添加到NSRunLoopCommonModes (kCFRunLoopCommonModes) 來解決幼东。

? ? ? ?2. 需要手動(dòng)添加到RunLoop臂容, 如果不用 addTimer: forMode方法手動(dòng)加入主循環(huán)池中,將不會(huì)循環(huán)執(zhí)行根蟹。并且如果不手動(dòng)調(diào)用fair脓杉,則定時(shí)器不會(huì)啟動(dòng)。

4. performSelector形式

/*

*withObject:需要攜帶的數(shù)據(jù)简逮,不傳則寫nil

afterDelay:幾秒后執(zhí)行

**/

[self performSelector:@selector(test) withObject:nil afterDelay:3];

注:我們知道只有主線程會(huì)在創(chuàng)建的時(shí)候默認(rèn)自動(dòng)運(yùn)行一個(gè)runloop球散,并且有timer,普通的子線程是沒有這些的散庶。這樣就帶來一個(gè)問題了蕉堰,有些時(shí)候我們并不確定我們的模塊是不是會(huì)異步調(diào)用到,而我們?cè)趯戇@樣的延時(shí)調(diào)用的時(shí)候一般都不會(huì)去檢查運(yùn)行時(shí)的環(huán)境悲龟,這樣在子線程中被調(diào)用的時(shí)候屋讶,我們的代碼中的延時(shí)調(diào)用的代碼就會(huì)一直等待timer的調(diào)度,但是實(shí)際上在子線程中又沒有這樣的timer须教,這樣我們的代碼就永遠(yuǎn)不會(huì)被調(diào)到皿渗。

解決辦法:[self performSelector:@selector(test) onThread:[NSThreadmainThread] withObject:nil waitUntilDone: NO];//指定了該selector在主線程中運(yùn)行

[self performSelector:@selector(testDelay) withObject:nil afterDelay:3 inModes:[NSArray arrayWithObject: NSDefaultRunLoopMode]];

[[NSRunLoop currentRunLoop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

//啟動(dòng)線程中runloop,因?yàn)槊總€(gè)線程就有個(gè)默認(rèn)的runloop

? ? ? ? ? ?在有多線程操作的環(huán)境中轻腺,這樣performSelector的延時(shí)調(diào)用乐疆,其實(shí)是缺乏安全性的。我們可以用另一套方案來解決這個(gè)問題约计,就是使用GCD中的dispatch_after來實(shí)現(xiàn)單次的延時(shí)調(diào)用诀拭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市煤蚌,隨后出現(xiàn)的幾起案子耕挨,更是在濱河造成了極大的恐慌细卧,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筒占,死亡現(xiàn)場(chǎng)離奇詭異贪庙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翰苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門止邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奏窑,你說我怎么就攤上這事导披。” “怎么了埃唯?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵撩匕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我墨叛,道長(zhǎng)止毕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任漠趁,我火速辦了婚禮扁凛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闯传。我一直安慰自己谨朝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布丸边。 她就那樣靜靜地躺著叠必,像睡著了一般荚孵。 火紅的嫁衣襯著肌膚如雪妹窖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天收叶,我揣著相機(jī)與錄音骄呼,去河邊找鬼。 笑死判没,一個(gè)胖子當(dāng)著我的面吹牛蜓萄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澄峰,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼嫉沽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了俏竞?” 一聲冷哼從身側(cè)響起绸硕,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤堂竟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后玻佩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體出嘹,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年咬崔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了税稼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垮斯,死狀恐怖郎仆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兜蠕,我是刑警寧澤丸升,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站牺氨,受9級(jí)特大地震影響狡耻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猴凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一夷狰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郊霎,春花似錦沼头、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至购对,卻和暖如春猾昆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骡苞。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工垂蜗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人解幽。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓贴见,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親躲株。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片部,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • Run loop 剖析:Runloop 接收的輸入事件來自兩種不同的源:輸入源(intput source)和定時(shí)...
    Mitchell閱讀 12,438評(píng)論 17 111
  • RunLoop的基本了解 **1 . RunLoop字面的意思 : **運(yùn)行循環(huán) / 跑圈 **2 . 基本作用 ...
    Mario_ZJ閱讀 518評(píng)論 1 3
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的,也是非常重要的霜定, 在面試過程中是經(jīng)常會(huì)被問到的档悠, ...
    made_China閱讀 1,211評(píng)論 0 7
  • 來源:擊水湘江 鏈接:http://www.reibang.com/p/536184bfd163 實(shí)例化講解Run...
    __Lex閱讀 270評(píng)論 0 2
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的捆探,也是非常重要的, 在面試過程中是經(jīng)常會(huì)被問到的站粟, ...
    SOI閱讀 21,819評(píng)論 3 63