UITableViewCell中使用GCD定時器注意事項

今天在敲代碼的時候轰传,出現一個cell復用以及GCD定時器倒計時的功能出現混亂的問題纱昧,由于之前一直使用NSTimer定時器,并未發(fā)現什么問題,這次本著學習使用的心態(tài)侣灶,把GCD搬上來甸祭,不聊出現一些意料之外的問題。

代碼的前置條件:該定時器在cell復用中倒計時

錯誤創(chuàng)建timer對象的方法是:

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue);

正確的創(chuàng)建timer方法應該是這樣:

self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

解釋:

錯誤創(chuàng)建的timer方法表示在每次調用倒計時方法startCountDown的時候褥影,都會創(chuàng)建一個全新的timer對象池户,然后放到全局隊列里進行倒計時,假設當前列表有3個cell伪阶,那么第一次調用時(也就是在第一次刷新時)煞檩,全局隊列會接收到3個不同的timer對象,當第二次調用該倒計時方法時栅贴,仍會創(chuàng)建3個與之前不同的timer對象斟湃,以此類推,刷新N次后檐薯,timer對象一共創(chuàng)建了2N個凝赛,此時全局隊列queue中就有2 *N個定時器,在下面的方法 [self.payBtn setTitle:text forState:UIControlStateNormal]; 就會并發(fā)不斷賦值坛缕,payBtn按鈕就會出現混亂閃動的現象墓猎。解決:通過創(chuàng)建全局的timer,在每次調用倒計時方法時赚楚,新對象就會覆蓋舊有對象毙沾,也就是不論調用多少次倒計時方法,一個cell始終只有一個timer對象宠页,timer對象的數量也就和cell數量一致**

下面直接上代碼左胞。

//time傳入的倒計時剩余時間
- (void)startCountDown:(long long)time{
    __block  long countDownTime = time;
    if (countDownTime>0) {
        @weakify(self);
        //創(chuàng)建一個全局隊列
 dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        dispatch_source_set_timer(self.timer, dispatch_walltime(NULL, 0), 1 * NSEC_PER_SEC, 0); //每秒執(zhí)行
        dispatch_source_set_event_handler(self.timer, ^{
            @strongify(self);
            if(!self || countDownTime <= 0 ){// 倒計時結束
                // 關閉定時器
                dispatch_source_cancel(self.timer);
                dispatch_async(dispatch_get_main_queue(), ^{
                    @strongify(self);
                    // 此處處理你需要的倒計時結束時的操作
                });
            }else{// 倒計時中
                NSString* text = [self timeDifferenceWithDelay:countDownTime];
                dispatch_async(dispatch_get_main_queue(), ^{
                    @strongify(self);
                    [self.payBtn setTitle:text forState:UIControlStateNormal];
                });
                
            }
            countDownTime--;
        });
        // 開啟定時器
        dispatch_resume(self.timer);
    }
}

// 該方法表示當倒計時剩下不超過30分鐘時的操作
-(NSString*)timeDifferenceWithDelay:(long long )delay{
    long second = delay % 60;
    long minute = delay/60%60;
    long hour = delay/3600 %3600;
    long day = delay/(24 * 3600);
    NSString *str;
    if (day== 0 && hour== 0 && minute<30) {
        str = [NSString stringWithFormat:@"付款 %02ld:%02ld",minute,second];
    }else {
        str = [NSString stringWithFormat:@"付款"];
    }
    NSLog(@"%02ld:%02ld:%02ld:%02ld",day,hour,minute,second);
    return str;
}

總結:其實這個問題不是什么大問題,關鍵是是否細心举户,在此記錄一下烤宙,為后來者借鑒!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末俭嘁,一起剝皮案震驚了整個濱河市躺枕,隨后出現的幾起案子,更是在濱河造成了極大的恐慌供填,老刑警劉巖拐云,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異近她,居然都是意外死亡慨丐,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門泄私,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事晌端⊥北” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵咧纠,是天一觀的道長蓬痒。 經常有香客問我,道長漆羔,這世上最難降的妖魔是什么梧奢? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮演痒,結果婚禮上亲轨,老公的妹妹穿的比我還像新娘。我一直安慰自己鸟顺,他們只是感情好惦蚊,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讯嫂,像睡著了一般蹦锋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欧芽,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天莉掂,我揣著相機與錄音,去河邊找鬼千扔。 笑死憎妙,一個胖子當著我的面吹牛,可吹牛的內容都是我干的昏鹃。 我是一名探鬼主播尚氛,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洞渤!你這毒婦竟也來了阅嘶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤载迄,失蹤者是張志新(化名)和其女友劉穎讯柔,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體护昧,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡魂迄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了惋耙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捣炬。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡熊昌,死狀恐怖,靈堂內的尸體忽然破棺而出湿酸,到底是詐尸還是另有隱情婿屹,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布推溃,位于F島的核電站昂利,受9級特大地震影響,放射性物質發(fā)生泄漏铁坎。R本人自食惡果不足惜蜂奸,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硬萍。 院中可真熱鬧扩所,春花似錦、人聲如沸襟铭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寒砖。三九已至赐劣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哩都,已是汗流浹背魁兼。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漠嵌,地道東北人咐汞。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像儒鹿,于是被迫代替她去往敵國和親化撕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容