20170318

日常

  • 8 点醒,但是很困,做完运营工作
  • 跑步两公里
  • 午饭
  • 去武林门
  • 银泰武林店星巴克买了杯红茶拿铁
  • 回家
  • 买了个应用:LightScreen

解决一个时间精度的问题

今天遇到一个问题,正在做 Price Tag 的降价列表,每次刷新列表会获取某个时间戳之后的数据,当获取到数据后,最后一条的更新时间会被保存下来作为下一个请求的时间戳来获取增量。

可是发现有时候会莫名其妙的多了一条数据,观察了很久发现这条数据就是上次存了时间戳的最后一条,可是我明明是用了>某个 DatePredicate:

NSPredicate(format: "modificationDate > %@", date)

测试了一下 < 这个 Date 是获取不下来的,于是怀疑是不是时间精度的问题,我是把 Date 转换成了 TimeInterval 存在 User Defaults 的,把获取下来的时间和存下去的时间对比了一下,果然是精度问题:

// CloudKit 获取的数据的时间
(lldb) po record.value(forKey: "modificationDate") as Date
▿ 2017-03-18 09:50:28 +0000
 - timeIntervalSinceReferenceDate : 511523428.64200002

// 转化成 TimeInterval 后
(lldb) po value
1489830628.642

很显然,就是相差了0.00000002导致我把最后一条也拿下来了,所以把 Date 转化成 TimeInterval 存在 User Defaults 里是不安全的。

最后是怎么解决的呢?

请原谅我的无知,user defaults 可以直接存 Date,不用转 😭