emqx / CocoaMQTT

MQTT 5.0 client library for iOS and macOS written in Swift
https://www.emqx.com/en
Other
1.59k stars 418 forks source link

Fix redeliver Timer error #358

Open GithubGaoYang opened 3 years ago

GithubGaoYang commented 3 years ago

修复重新发送计时器错误

错误描述

在 Re-delivery frame 时,对 frame 的 timestamp 进行了重新赋值,但程序运行需要消耗时间,导致会出现几毫秒的误差,于是在定时器下一次被触发时,nowTimestamp - frame.timestamp 比 (retryTimeInterval/1000.0) 小几毫秒,导致多数情况下定时器每执行两次才会触发一次 Re-delivery frame 逻辑,误差测试如下: image

修复方案

为 Frame 增加一个重试次数(retryCount)变量,在 redeliver 方法中,比较 时间差值(nowTimestamp - frame.timestamp) 与 重试时间重试次数((retryTimeInterval/1000.0) frame.retryCount)的大小,即:

if (nowTimestamp - frame.timestamp) >= (retryTimeInterval/1000.0) * Double(frame.retryCount) {}

说明

以上是我能想到的处理方案,如果有更好的处理方式,欢迎回复我。