iOS商城類(lèi)商品搶購(gòu)倒計(jì)時(shí)那點(diǎn)事

一.之前電商項(xiàng)目做過(guò)的倒計(jì)時(shí)功能戒傻,筆記一下友瘤。
主要有兩種思路:①:根據(jù)當(dāng)前系統(tǒng)時(shí)間和搶購(gòu)結(jié)束時(shí)間計(jì)算差值挤土,計(jì)算倒計(jì)時(shí)识虚。 ②:后臺(tái)返回當(dāng)前時(shí)間距離搶購(gòu)結(jié)束時(shí)間的總秒數(shù)肢扯。根據(jù)秒數(shù)本地倒計(jì)時(shí)。(第二種方案更為準(zhǔn)確担锤,不受本地時(shí)間誤差的影響)

代碼如下:

方案一:根據(jù)當(dāng)前系統(tǒng)時(shí)間和搶購(gòu)結(jié)束時(shí)間計(jì)算差值蔚晨,計(jì)算倒計(jì)時(shí)。在cell的m文件中計(jì)算肛循。但是系統(tǒng)時(shí)間可能有誤差铭腕,導(dǎo)致計(jì)時(shí)準(zhǔn)確性有待提高银择。
1.cell的.h文件中定義屬性字段@property(nonatomic,copy) NSString* endTime;
2:cell的.m文件中重寫(xiě)endTime的set方法,傳入結(jié)束日期累舷。
- (void)setEndTime:(NSString *)endTime 
{
    _endTime  =endTime;
    NSTimer *time = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(refreshTime:) userInfo:nil repeats:YES];
    [self refreshTime:time];
    [[NSRunLoop currentRunLoop] addTimer:time forMode:NSRunLoopCommonModes];
}
- (void)refreshTime:(NSTimer *)tm
{
    NSDate *currentDate =[NSDate date];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    NSCalendarUnit  unit = NSDayCalendarUnit | NSCalendarUnitHour | NSCalendarUnitMinute  | NSCalendarUnitSecond;
    NSDateComponents *commponent = [calendar components:unit fromDate:currentDate toDate:[HFTools getDateWithString:_endTime ] options:NSCalendarWrapComponents];
    
    NSDate *dt = [[HFTools getDateWithString:_endTime] earlierDate:currentDate];
    if([dt isEqualToDate:[HFTools getDateWithString:_endTime ]])
    {
        [tm invalidate];
        self.daoJiShiLabel.text = [NSString stringWithFormat:@"剩余0天 已結(jié)束"];
    }else
    {
        self.daoJiShiLabel.text = [NSString stringWithFormat:@"剩余%zd天 %02zd:%02zd:%02zd",commponent.day,commponent.hour,commponent.minute,commponent.second];    
    }
}
/******************
//其中[HFTools getDateWithString:_endTime ]方法為:
+(NSDate*)getDateWithString:(NSString *)time{
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];//實(shí)例化一個(gè)NSDateFormatter對(duì)象
     [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];//設(shè)定時(shí)間格式,這里可以設(shè)置成自己需要的格式 
    NSDate *date =[dateFormat dateFromString:time];
    return date;
}

方案二:

**方案二:后臺(tái)給出距離搶購(gòu)結(jié)束的總秒數(shù)浩考,根據(jù)總秒數(shù),計(jì)算倒計(jì)時(shí)被盈。(計(jì)時(shí)準(zhǔn)確.)怀挠。


![countDownPic.gif](http://upload-images.jianshu.io/upload_images/1486049-1d675936523b06f0.gif?imageMogr2/auto-orient/strip)

代碼:
#pragma mark - - 倒計(jì)時(shí)Timer..
- (void)initCountDown {
    for (NSInteger i = 0; i < self.dataArray.count; i++)
    {
        //將倒計(jì)時(shí)總秒數(shù)數(shù)組根據(jù)indexpath依次存入字典
        NSDictionary *CountDic = @{@"indexPath":[NSString stringWithFormat:@"%ld",i],@"lastTime": self.dataArray[i]};
        [self.countDownDataArray addObject:CountDic];
    }
    
    // 防止刷新界面的時(shí)候創(chuàng)建多個(gè)定時(shí)器,導(dǎo)致多個(gè)定時(shí)器一起倒計(jì)時(shí)害捕。
    if (!self.MainTimer) {
        [self startTimer];
    }
}

//倒計(jì)時(shí)
- (void)startTimer
{
    self.MainTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(refreshLessTime) userInfo:@"" repeats:YES];
    
    //如果不添加下面這條語(yǔ)句绿淋,在UITableView拖動(dòng)的時(shí)候,會(huì)阻塞定時(shí)器的調(diào)用
    [[NSRunLoop currentRunLoop] addTimer:self.MainTimer forMode:UITrackingRunLoopMode];
}

//刷新時(shí)間
- (void)refreshLessTime
{
    NSUInteger time;
    for (int i = 0; i < self.countDownDataArray.count; i++) {
        time = [[[self.countDownDataArray objectAtIndex:i] objectForKey:@"lastTime"] integerValue];
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:[[[self.countDownDataArray objectAtIndex:i] objectForKey:@"indexPath"] integerValue] inSection:0];
        NSInteger oldTime;
        if (time == 0) {
            oldTime = 0;
        }else {
            oldTime = --time;
        }
        NSString *str;
        str = [NSString stringWithFormat:@"%@",[self lessSecondToDay:oldTime]];
        
        //根據(jù)indexpath取cell
        YMCountDownCell *cell = (YMCountDownCell *)[self.tableView cellForRowAtIndexPath:indexPath];
        cell.countDownLabel.text = [self lessSecondToDay:oldTime];
        
        //將倒計(jì)時(shí)后的秒數(shù)存入數(shù)組尝盼,刷新數(shù)據(jù)源吞滞。
        NSDictionary *dic = @{@"indexPath": [NSString stringWithFormat:@"%ld",indexPath.row],@"lastTime": [NSString stringWithFormat:@"%ld",time]};
        [self.countDownDataArray replaceObjectAtIndex:i withObject:dic];
    }
}

//根據(jù)秒數(shù)計(jì)算剩余時(shí)間:天,小時(shí)盾沫,分鐘裁赠,秒
- (NSString *)lessSecondToDay:(NSUInteger)seconds
{
    NSUInteger day  = (NSUInteger)seconds/(24*3600);
    NSUInteger hour = (NSUInteger)(seconds%(24*3600))/3600;
    NSUInteger min  = (NSUInteger)(seconds%(3600))/60;
    NSUInteger second = (NSUInteger)(seconds%60);
    NSString *timeStr;
    if (seconds == 0) {
        timeStr = @"已結(jié)束";
        [self countDownFinished];
    }else {
        timeStr = [NSString stringWithFormat:@"%02zd天 %02zd:%02zd:%02zd",(unsigned long)day,(unsigned long)hour,(unsigned long)min,(unsigned long)second];
    }
    return timeStr;
}

// do something when the The countdown ends
- (void)countDownFinished
{
    
}


注意:倒計(jì)時(shí)開(kāi)始會(huì)有一秒的刷新空檔期,可以鋪上倒計(jì)時(shí)數(shù)據(jù)防止倒計(jì)時(shí)UI一片白.(如果有刷新赴精,刷新的時(shí)候要更新數(shù)據(jù)源 self.dataArray)佩捞。
我用的tableview,所以就在cell上鋪蕾哟。

NSInteger backTime = [self.dataArray[indexPath.row] integerValue];
    NSString *backStr  = [self lessSecondToDay:backTime];
    cell.countDownLabel.text = backStr;

最后附上方案二的github鏈接 倒計(jì)時(shí)Demo

ps:如果有好的思路歡迎拍磚交流哈一忱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谭确,隨后出現(xiàn)的幾起案子帘营,更是在濱河造成了極大的恐慌,老刑警劉巖逐哈,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芬迄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昂秃,警方通過(guò)查閱死者的電腦和手機(jī)禀梳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肠骆,“玉大人算途,你說(shuō)我怎么就攤上這事』└辏” “怎么了郊艘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵荷科,是天一觀的道長(zhǎng)唯咬。 經(jīng)常有香客問(wèn)我纱注,道長(zhǎng),這世上最難降的妖魔是什么胆胰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任狞贱,我火速辦了婚禮,結(jié)果婚禮上蜀涨,老公的妹妹穿的比我還像新娘瞎嬉。我一直安慰自己,他們只是感情好厚柳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布氧枣。 她就那樣靜靜地躺著,像睡著了一般别垮。 火紅的嫁衣襯著肌膚如雪便监。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天碳想,我揣著相機(jī)與錄音烧董,去河邊找鬼。 笑死胧奔,一個(gè)胖子當(dāng)著我的面吹牛逊移,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播龙填,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胳泉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了岩遗?” 一聲冷哼從身側(cè)響起胶背,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喘先,沒(méi)想到半個(gè)月后钳吟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窘拯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年红且,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涤姊。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暇番,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出思喊,到底是詐尸還是另有隱情壁酬,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站舆乔,受9級(jí)特大地震影響岳服,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜希俩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一吊宋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颜武,春花似錦璃搜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至篙议,卻和暖如春橘原,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涡上。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工趾断, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吩愧。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓芋酌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親雁佳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脐帝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 2017.02.22 可以練習(xí),每當(dāng)這個(gè)時(shí)候糖权,腦袋就犯困堵腹,我這腦袋真是神奇呀,一說(shuō)讓你做事情星澳,你就犯困疚顷,你可不要太...
    Carden閱讀 1,346評(píng)論 0 1
  • 游魂 打卡<1984》 完 意識(shí)形態(tài)對(duì)立下的產(chǎn)物 對(duì)于社會(huì)主義的妖魔化 請(qǐng)不要將情節(jié)與那個(gè)年代對(duì)標(biāo) 雖然它們的確相...
    132db6d301e0閱讀 281評(píng)論 0 0
  • 東方收藏閱讀 143評(píng)論 0 0
  • iOS的沙盒機(jī)制,應(yīng)用只能訪問(wèn)自己應(yīng)用目錄下的文件禁偎。iOS不像Android腿堤,沒(méi)有SD卡概念,不能直接訪問(wèn)圖像如暖、視...
    Smallwolf_JS閱讀 968評(píng)論 0 0