Objective-C中基于RSSI筛选最近Beacon的转换代码问题排查
解决Objective-C中通过RSSI筛选最近Beacon的问题
你遇到的问题其实出在初始值的判断逻辑上,咱们来拆解下问题根源:
你转译的Objective-C代码和原Swift代码都犯了同一个小疏漏:当第一次循环时,closest(对应Swift里的closestBeacon)是nil,这时候closest != nil这个条件会直接让第一个符合rssi < 0的Beacon被跳过,根本不会被赋值给closest。后面的循环因为closest一直是nil,也就没法进行有效的对比筛选了。
修正后的Objective-C代码
CLBeacon *closest = nil; for (CLBeacon *beacon in beacons) { // 先过滤无效的RSSI值(0通常表示无有效信号) if (beacon.rssi >= 0) { continue; } // 初始状态:如果closest还是nil,先把当前有效Beacon设为基准 if (closest == nil) { closest = beacon; } // 后续对比:如果当前Beacon的RSSI比已记录的更大(信号更强=更近),就更新closest else if (beacon.rssi > closest.rssi) { closest = beacon; } }
逻辑说明
- 先过滤
rssi >= 0的情况:Beacon的RSSI正常为负数,0一般代表设备未获取到有效信号,这类数据可以直接跳过。 - 处理初始
nil状态:第一次遇到有效RSSI的Beacon时,直接将它设为当前最近的Beacon基准。 - 后续循环对比:RSSI数值越大(比如-40比-60大),代表信号越强、Beacon距离越近,所以只要当前Beacon的RSSI比已记录的更大,就更新
closest。
这样修改后,就能正确遍历所有Beacon,筛选出RSSI最优(距离最近)的设备了。
内容的提问来源于stack exchange,提问作者Eshwar
相关产品推荐
相关产品推荐

