iOS 在子線程中NSTimer的啟動和關(guān)閉

之前在項(xiàng)目中遇見了一個問題游岳,在子線程中如何開啟NSTimer和取消NSTimer”溃現(xiàn)在總結(jié)一下垛膝,當(dāng)做自己的筆記锤灿。

1.子線程中NSTimer的開啟

首先在.m文件中聲明兩個屬性一個是子線程 一個是子線程中的NSTimer。


@property (nonatomic, strong) NSThread *thread1;

@property (nonatomic, strong) NSTimer *threadTimer;

然后用GCD在全局全隊(duì)中創(chuàng)建一個子線程并創(chuàng)建NSTimer。

    __weak __typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        __strong __typeof(weakSelf) strongSelf = weakSelf;
        if (strongSelf) {
            strongSelf.thread1 = [NSThread currentThread];
            [strongSelf.thread1 setName:@"線程A"];
            strongSelf.threadTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:strongSelf selector:@selector(timerAction) userInfo:nil repeats:YES];
            NSRunLoop *runloop = [NSRunLoop currentRunLoop];
            [runloop addTimer:strongSelf.threadTimer forMode:NSDefaultRunLoopMode];
            [runloop run];
        }
    });

注意的是:在子線程中創(chuàng)建的NSTimer需要加入到對應(yīng)線程的RunLoop中克握。RunLoop中常用的mode有:NSDefaultRunLoopMode蕾管、UITrackingRunLoopMode和NSRunLoopCommonModes三種模式。

NSDefaultRunLoop 默認(rèn)模式

UITrackingRunLoop 界面追蹤菩暗,用于scrollView拖拽 滑動

NSRunLoopCommonModes 不是一個特定的模式掰曾,只是一種標(biāo)記,比較綜合的一種模式(包含 前兩種模式)

在NSTimer加入RunLoop后停团,需要將RunLoop運(yùn)行起來旷坦。

2.子線程中NSTimer的關(guān)閉

之后創(chuàng)建一個cancelTimer的方法

- (void)cancel{

if (self.threadTimer) {

[self.threadTimer invalidate];

self.threadTimer = nil;

}

}

如果這個方法跟創(chuàng)建NSTimer不在同一個線程執(zhí)行是無法將Timer 執(zhí)行invalidate操作的。

然后現(xiàn)在我們需要在thread1這個線程中執(zhí)行這個操作佑稠,在這里寫一個方法用于在子線程中調(diào)用此方法秒梅。

- (void)cancelTimer{

if (self.threadTimer && self.thread1) {

[self performSelector:@selector(cancel) onThread:self.thread1 withObject:nil waitUntilDone:YES];

}

}

最后我們在有需要關(guān)閉Timer的地方執(zhí)行此方法即可。

在這里說明一下為什么NSTimer要在同一個線程中創(chuàng)建和關(guān)閉舌胶。因?yàn)閯?chuàng)建的Timer的時候已經(jīng)把Timer加入到該線程對應(yīng)的RunLoop中捆蜀,這個RunLoop設(shè)置了這個Timer為一個事件。因此要在同一個線程中才能cancel這個Timer幔嫂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辆它,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子履恩,更是在濱河造成了極大的恐慌娩井,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件似袁,死亡現(xiàn)場離奇詭異,居然都是意外死亡咐刨,警方通過查閱死者的電腦和手機(jī)昙衅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來定鸟,“玉大人而涉,你說我怎么就攤上這事×瑁” “怎么了啼县?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沸久。 經(jīng)常有香客問我季眷,道長,這世上最難降的妖魔是什么卷胯? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任子刮,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挺峡。我一直安慰自己葵孤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布橱赠。 她就那樣靜靜地躺著尤仍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狭姨。 梳的紋絲不亂的頭發(fā)上宰啦,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機(jī)與錄音送挑,去河邊找鬼绑莺。 笑死,一個胖子當(dāng)著我的面吹牛惕耕,可吹牛的內(nèi)容都是我干的纺裁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粥烁!你這毒婦竟也來了备闲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤谚殊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛤铜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫩絮,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年围肥,在試婚紗的時候發(fā)現(xiàn)自己被綠了剿干。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡穆刻,死狀恐怖置尔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氢伟,我是刑警寧澤榜轿,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站朵锣,受9級特大地震影響谬盐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猪勇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一设褐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦助析、人聲如沸犀被。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寡键。三九已至,卻和暖如春雪隧,著一層夾襖步出監(jiān)牢的瞬間西轩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工脑沿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藕畔,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓庄拇,卻偏偏與公主長得像注服,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子措近,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

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