美文网首页
iOS tableviewCell中的Timer

iOS tableviewCell中的Timer

作者: 我想走走 | 来源:发表于2018-05-24 10:52 被阅读173次

    参考
    使用的是第三方: OYCountDownManager
    详细看了这个工具类,运用的是时间差的方法实现倒计时的功能。
    比如说我们从后台请求到的时间是500秒的时间段,那么工具类里面的timeInterval会从0开始每秒增加,然后用500-timeInterval,达到倒计时显示的功能。
    页面的刷新,将timeInterval置为0.因为刷新页面相当于重新请求数据,比如说第二次请求数据此时为350秒,将timeInterval置为0之后,就是350-0,达到页面刷新的效果。
    大神写的挺好的。

    #import "OYSingleTableVC.h"
    #import "OYModel.h"
    #import "OYTableViewCell.h"
    #import "OYCountDownManager.h"
    @interface OYSingleTableVC ()<UITableViewDataSource, UITableViewDelegate>
    
    @property (nonatomic, strong) UITableView *tableView;
    @property (nonatomic, strong) NSArray *dataSource;
    
    @end
    
    @implementation OYSingleTableVC
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.title = @"单个列表倒计时";
        self.view.backgroundColor = [UIColor whiteColor];
        [self.view addSubview:self.tableView];
        
        // 启动倒计时管理
        [kCountDownManager start];
    }
    
    #pragma mark - UITableViewDataSource, UITableViewDelegate
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.dataSource.count;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        OYTableViewCell *cell = (OYTableViewCell *)[tableView dequeueReusableCellWithIdentifier:OYTableViewCellID];
        // 传递模型
        OYModel *model = self.dataSource[indexPath.row];
        cell.model = model;
        [cell setCountDownZero:^(OYModel *timeOutModel){
            // 回调
            if (!timeOutModel.timeOut) {
                NSLog(@"SingleTableVC--%@--时间到了", timeOutModel.title);
            }
            // 标志
            timeOutModel.timeOut = YES;
        }];
        return cell;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return 50;
    }
    
    #pragma mark - 刷新数据
    - (void)reloadData {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 模拟网络请求
            self.dataSource = nil;
            // 调用reload
            [kCountDownManager reload];
            // 刷新
            [self.tableView reloadData];
            // 停止刷新
            [self.tableView.refreshControl endRefreshing];
        });
    }
    
    #pragma mark - Getter
    - (UITableView *)tableView {
        if (!_tableView) {
            _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
            _tableView.dataSource = self;
            _tableView.delegate = self;
            _tableView.refreshControl = [[UIRefreshControl alloc] init];
            [_tableView.refreshControl addTarget:self action:@selector(reloadData) forControlEvents:UIControlEventValueChanged];
            [_tableView registerClass:NSClassFromString(OYTableViewCellID) forCellReuseIdentifier:OYTableViewCellID];
        }
        return _tableView;
    }
    
    - (NSArray *)dataSource {
        if (_dataSource == nil) {
            NSMutableArray *arrM = [NSMutableArray array];
            for (NSInteger i=0; i<50; i++) {
                // 模拟从服务器取得数据 -- 例如:服务器返回的数据为剩余时间数
                NSInteger count = arc4random_uniform(100); //生成0-100之间的随机正整数
                OYModel *model = [[OYModel alloc]init];
                model.count = count;
                model.title = [NSString stringWithFormat:@"第%zd条数据", i];
                [arrM addObject:model];
            }
            _dataSource = arrM.copy;
        }
        return _dataSource;
    }
    
    - (void)dealloc {
        // 废除定时器
        [kCountDownManager invalidate];
        // 清空时间差
        [kCountDownManager reload];
    }
    @end
    
    //
    //  TableViewCell.m
    //  CellCountDown
    //
    //  Created by herobin on 16/9/11.
    //  Copyright © 2016年 herobin. All rights reserved.
    //
    
    #import "OYTableViewCell.h"
    #import "OYCountDownManager.h"
    #import "OYModel.h"
    NSString *const OYTableViewCellID = @"OYTableViewCell";
    
    @interface OYTableViewCell ()
    
    @end
    
    @implementation OYTableViewCell
    
    // 代码创建
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        if (self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]) {
            // 监听通知
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(countDownNotification) name:OYCountDownNotification object:nil];
        }
        return self;
    }
    
    // xib创建
    - (instancetype)initWithCoder:(NSCoder *)coder
    {
        self = [super initWithCoder:coder];
        if (self) {
            // 监听通知
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(countDownNotification) name:OYCountDownNotification object:nil];
        }
        return self;
    }
    
    #pragma mark - 倒计时通知回调
    - (void)countDownNotification {
        /// 判断是否需要倒计时 -- 可能有的cell不需要倒计时,根据真实需求来进行判断
        if (0) {
            return;
        }
        
        /// 计算倒计时
        OYModel *model = self.model;
        NSInteger timeInterval;
        
        
        
        if (model.countDownSource) {
            
            timeInterval = [kCountDownManager timeIntervalWithIdentifier:model.countDownSource];
        }else {
            
            
            timeInterval = kCountDownManager.timeInterval;
            NSLog(@"fengfeng---%ld",kCountDownManager.timeInterval);
        }
        
        
        NSInteger countDown = model.count - timeInterval;
        /// 当倒计时到了进行回调
        if (countDown <= 0) {
            self.detailTextLabel.text = @"活动开始";
            // 回调给控制器
            if (self.countDownZero) {
                self.countDownZero(model);
            }
            return;
        }
        /// 重新赋值
        self.detailTextLabel.text = [NSString stringWithFormat:@"倒计时%02zd:%02zd:%02zd", countDown/3600, (countDown/60)%60, countDown%60];
    }
    
    ///  重写setter方法
    - (void)setModel:(OYModel *)model {
        _model = model;
        
        self.textLabel.text = model.title;
        // 手动刷新数据
        [self countDownNotification];
    }
    
    - (void)dealloc {
        [[NSNotificationCenter defaultCenter]removeObserver:self];
    }
    
    @end
    

    在这里记录下。
    OYCountDownManager下载地址

    相关文章

      网友评论

          本文标题:iOS tableviewCell中的Timer

          本文链接:https://www.haomeiwen.com/subject/otijjftx.html