美文网首页iOS 功能类
app倒计时处理,以及客户端和服务器之间的时间同步

app倒计时处理,以及客户端和服务器之间的时间同步

作者: yazho | 来源:发表于2018-11-20 20:10 被阅读0次

    最近项目中用到了很多倒计时的,比如获取验证码的页面、直播倒计时页面;
    这样就会导致app里有多个NSTimer在倒计时,这样对性能有所损耗;
    所以考虑加个TimerService类,专门做倒计时处理
    TimerService内部负责维护唯一一个定时器,同时提供添加和移除监听者的接口以及监听者需要实现的协议protocol,内部通过HashTable来存储监听者,每次定时器回调,遍历所有监听者进行回调,监听者在不需要接收定时器回调的时候只需要从TimerService中移除即可

    • (void)addListener:(id<TimerListener>)listener {
      TIMER_SERVICE_LOCK(self.operationsLock)
      if(![self.map containsObject:listener]){
      [self.map addObject:listener];
      if(self.map.count > 0){
      //启动
      [self startTimer];
      }
      }
      TIMER_SERVICE_UNLOCK(self.operationsLock)
      }
    • (void)removeListener:(id<TimerListener>)listener {
      TIMER_SERVICE_LOCK(self.operationsLock)
      if([self.map containsObject:listener]){
      [self.map removeObject:listener];
      if(self.map.count == 0){
      //暂停
      [self stopTimer];
      }
      }
      TIMER_SERVICE_UNLOCK(self.operationsLock)
      }

    直播倒计时存在客户端和服务器之间的时间同步
    提供方法不管用户是否调整手机时间获取到的时间不受影响
    gettimeofday:
    这个API也能返回一个描述当前时间的值
    使用gettimeofday获得的值是Unix time。
    Unix time是以UTC 1970年1月1号 00:00:00为基准时间,当前时间距离基准点偏移的秒数。上述API返回的值是1481266031,表示当前时间距离UTC 1970年1月1号 00:00:00一共过了1481266031秒。
    这个API返回的值会受系统时间影响,用户如果修改时间,值也会随着变化。

    sysctl
    返回的值是上次设备重启的时间Unix time。(eg上次开启时间是10.28号,则返回的时间就是1970年到开启那天的unix时间)
    这个API返回的值也会受系统时间影响,用户如果修改时间,值也会随着变化。

    • (long)bootTime
      {

    define MIB_SIZE 2

    int mib[MIB_SIZE];
    size_t size;
    struct timeval  boottime;
    
    mib[0] = CTL_KERN;
    mib[1] = KERN_BOOTTIME;
    size = sizeof(boottime);
    if (sysctl(mib, MIB_SIZE, &boottime, &size, NULL, 0) != -1)
    {
        return boottime.tv_sec;
    }
    return 0;
    

    }

    mach_absolute_time()
    CPU的时钟周期数(ticks)。这个tick的数值可以用来描述时间,而mach_absolute_time()返回的就是CPU已经运行的tick的数量。将这个tick数经过一定的转换就可以变成秒数,或者纳秒数,这样就和时间直接关联了。
    这个tick数,在每次手机重启之后,会重新开始计数,而且iPhone锁屏进入休眠之后tick也会暂停计数。
    mach_absolute_time()不会受系统时间影响,只受设备重启和休眠行为影响

    获取系统当前运行了多长时间:
    gettimeofday和sysctl都会受系统时间影响,但他们二者做一个减法所得的值,就和系统时间无关了。这样就可以避免用户修改时间了

    • (NSTimeInterval)uptime
      {
      struct timeval boottime;
      int mib[2] = {CTL_KERN, KERN_BOOTTIME};
      size_t size = sizeof(boottime);
      struct timeval now;
      struct timezone tz;
      gettimeofday(&now, &tz);
      double uptime = -1;
      if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
      {
      uptime = now.tv_sec - boottime.tv_sec;
      uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;
      }
      return uptime;
      }

    参考博客:https://juejin.im/post/5bf121b6f265da613a539d9c
    https://mp.weixin.qq.com/s/cSZUNMuqk6DL3-nctyxzcw

    相关文章

      网友评论

        本文标题:app倒计时处理,以及客户端和服务器之间的时间同步

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