iOS商城類商品搶購倒數計時那點事
一.之前電商專案做過的倒數計時功能,筆記一下。
主要有兩種思路:①:根據當前系統時間和搶購結束時間計算差值,計算倒數計時。 ②:後臺返回當前時間距離搶購結束時間的總秒數。根據秒數本地倒數計時。(第二種方案更為準確,不受本地時間誤差的影響)
程式碼如下:
方案一:根據當前系統時間和搶購結束時間計算差值,計算倒數計時。在cell的m檔案中計算。但是系統時間可能有誤差,導致計時準確性有待提高。
1.cell的.h檔案中定義屬性欄位@property(nonatomic,copy) NSString* endTime;
2:cell的.m檔案中重寫endTime的set方法,傳入結束日期。
- (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天 已結束"];
}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];//例項化一個NSDateFormatter物件
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];//設定時間格式,這裡可以設定成自己需要的格式
NSDate *date =[dateFormat dateFromString:time];
return date;
}
方案二:
**方案二:後臺給出距離搶購結束的總秒數,根據總秒數,計算倒數計時。(計時準確.)。
![countDownPic.gif](http://upload-images.jianshu.io/upload_images/1486049-1d675936523b06f0.gif?imageMogr2/auto-orient/strip)
程式碼:
#pragma mark - - 倒數計時Timer..
- (void)initCountDown {
for (NSInteger i = 0; i < self.dataArray.count; i++)
{
//將倒數計時總秒數陣列根據indexpath依次存入字典
NSDictionary *CountDic = @{@"indexPath":[NSString stringWithFormat:@"%ld",i],@"lastTime": self.dataArray[i]};
[self.countDownDataArray addObject:CountDic];
}
// 防止重新整理介面的時候建立多個定時器,導致多個定時器一起倒數計時。
if (!self.MainTimer) {
[self startTimer];
}
}
//倒數計時
- (void)startTimer
{
self.MainTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(refreshLessTime) userInfo:@"" repeats:YES];
//如果不新增下面這條語句,在UITableView拖動的時候,會阻塞定時器的呼叫
[[NSRunLoop currentRunLoop] addTimer:self.MainTimer forMode:UITrackingRunLoopMode];
}
//重新整理時間
- (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]];
//根據indexpath取cell
YMCountDownCell *cell = (YMCountDownCell *)[self.tableView cellForRowAtIndexPath:indexPath];
cell.countDownLabel.text = [self lessSecondToDay:oldTime];
//將倒數計時後的秒數存入陣列,重新整理資料來源。
NSDictionary *dic = @{@"indexPath": [NSString stringWithFormat:@"%ld",indexPath.row],@"lastTime": [NSString stringWithFormat:@"%ld",time]};
[self.countDownDataArray replaceObjectAtIndex:i withObject:dic];
}
}
//根據秒數計算剩餘時間:天,小時,分鐘,秒
- (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 = @"已結束";
[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
{
}
注意:倒數計時開始會有一秒的重新整理空檔期,可以鋪上倒數計時資料防止倒數計時UI一片白.(如果有重新整理,重新整理的時候要更新資料來源 self.dataArray)。
我用的tableview,所以就在cell上鋪。
NSInteger backTime = [self.dataArray[indexPath.row] integerValue];
NSString *backStr = [self lessSecondToDay:backTime];
cell.countDownLabel.text = backStr;
最後附上方案二的github連結 倒數計時Demo
ps:如果有好的思路歡迎拍磚交流哈。
相關文章
- 商品搶購倒數計時效果程式碼例項
- js 搶購倒數計時,豪秒級變動JS
- iOS時間那點事--NSDateiOS
- 搶購倒數計時自定義控制元件的實現與優化控制元件優化
- 視訊直播系統原始碼,倒數計時顯示,商品秒殺倒數計時原始碼
- 搶購倒數計時自定義控制元件的實現與最佳化控制元件
- Flutter 中“倒數計時”的那些事兒Flutter
- 倒數計時4天UnityVisionVR/ARSummitAsia20165折門票搶購中UnityVRMIT
- iOS倒數計時的探究與選擇iOS
- Android 倒數計時類CountDownTimerAndroid
- 直播電商原始碼,商品出售倒數計時的定時器效果原始碼定時器
- asp.net 購物網站倒數計時功能ASP.NET網站
- PHP定時器那點事PHP定時器
- JavaScript倒數計時JavaScript
- js——倒數計時JS
- JS倒數計時JS
- 直播帶貨app開發,制定商品秒殺倒數計時提示APP
- iOS多執行緒那點事兒iOS執行緒
- iOS 關於 GIF 圖片那點事iOS
- 倒數計時3天!U聚合開發者大會日程公佈,五大亮點搶先看
- 直播商城系統原始碼,js製作倒數計時,天,小時,分,秒原始碼JS
- Kookjs 倒數計時JS
- 倒數計時34天
- 直播商城APP,直接實現購物車商品數量加減APP
- 計算時間差,頁面倒數計時,安卓與ios相容問題安卓iOS
- iOS倒數計時設計思路和一個系統時間的坑iOS
- laravel 9 倒數計時了Laravel
- 小程式倒數計時深究
- canvas環形倒數計時Canvas
- 倒數計時門栓(CountDownLatch)CountDownLatch
- 倒數計時然後才可以點選效果程式碼
- 倒數計時2天!《塞爾之光》ios不刪檔首發iOS
- js自動倒數計時程式碼,倒數計時完畢時自動停止迴圈JS
- js倒數計時 實現傳送驗證碼倒數計時60sJS
- Flutter倒數計時/計時器的實現Flutter
- 線上直播系統原始碼,預設倒數計時,自定義輸入時間倒數計時原始碼
- javascript實現表單可點選倒數計時程式碼JavaScript
- iOS程式進入後臺,倒數計時暫停解決方法iOS