iOS倒计时秒杀界面 tableview

iOS倒计时秒杀界面 tableview_第1张图片
miaoShaTest.gif

根据时间数组和cell id数组 获取每个cell的倒计时时间 并在cell显示时赋值


- (void)getTimeStrWith:(NSArray *)timeStrArr and:(NSArray *)cellIdArr{
    
    dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0; i< timeStrArr.count; i++) {
        
        __block int timeout=[timeStrArr[i] intValue]; //倒计时时间
        
        dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
        dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
        
        dispatch_source_set_event_handler(_timer, ^{
            
            if(timeout<=0){ //倒计时结束,关闭
                dispatch_source_cancel(_timer);
                dispatch_async(dispatch_get_main_queue(), ^{
                    [_dataDic setObject:@"停止秒杀"  forKey:cellIdArr[i]];
                    [_myTableView reloadData];
                });
            }else{
                int minutes = timeout / 60;
                int seconds = timeout % 60;
                NSString *strTime = [NSString stringWithFormat:@"%d分%.2d秒后停止秒杀",minutes, seconds];
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    [_dataDic setObject:strTime forKey:cellIdArr[i]];
                   
                    [_myTableView reloadData];
                });
                timeout--;
            }
            
        });
        dispatch_resume(_timer);
    }
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    JQTableViewCell *cell = [JQTableViewCell initWith:tableView];   
    cell.cellID = _cellidArr[indexPath.row];   
    cell.timeLineLabel.text = [_dataDic objectForKey:cell.cellID];
 
    return cell;
}

鉴于真机测试会发生后台timer不运行的情况,增加一个程序进入后台通知,延长后台任务执行

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForegroundNotification) name:UIApplicationDidEnterBackgroundNotification object:nil];

- (void) appWillEnterForegroundNotification{
    UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    //申请一个后台执行的任务 大概10分钟 如果时间更长的话需要借助默认音频等
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];

}

Demo地址 欢迎Star

你可能感兴趣的:(iOS倒计时秒杀界面 tableview)