【问题标题】:Find Closest Beacon in every second by using RSSI in Objective-C在 Objective-C 中使用 RSSI 每秒查找最近的信标
【发布时间】:2019-11-10 22:44:10
【问题描述】:

在 Stack Overflow 中,我看到了找到最近信标 (Swift find closest Beacon by rssi) 的答案。

在这里,我尝试准确地在 Objective-C 中找到最接近的。我的应用程序每秒钟都会发现信标,因为时间准确性无法正确找到最接近的位置。正如他所说,RSSI 将每 1 秒更新一次。所以我想使用 RSSI 过滤最近的信标。我将您的 Swift 代码转换为 Objective-C,但它不能正常工作。

这是 Swift 代码:

//Swift code
var closestBeacon: CLBeacon? = nil
for beacon in beacons {
    if beacon.rssi < 0 && closestBeacon != nil && beacon.rssi > closestBeacon!.rssi {
        closestBeacon = beacon as? CLBeacon
    }
}

这是我转换的 Objective-C 代码不起作用:

CLBeacon *closest = nil;

for (CLBeacon *beacon in beacons) {

    if (beacon.rssi < 0 &&  closest != nil && beacon.rssi > closest.rssi) {

        closest = beacon;

    }
}

请在我做错的地方完善我。

【问题讨论】:

  • 您需要在循环之前的某个时间点为closest 设置一个值,否则它将始终为nilif 永远不会为真
  • @P4yam,我已批准您的编辑,但请参阅我的后续编辑以了解如何进行正确的代码格式化。
  • 我认为您可以使用max(by:) 找到具有最大值的信标,并将其与您保存的信标进行比较(如果存在)进行设置。

标签: ios objective-c clbeacon


【解决方案1】:

正如@paulw11 建议的那样,两个版本的代码都存在错误。因为我写了这个错误来回答另一个问题,所以这里是一个修复:

斯威夫特

var closestBeacon: CLBeacon? = nil
for beacon in beacons {
    if closestBeacon == nil || beacon.rssi < 0 && beacon.rssi > closestBeacon!.rssi {
        closestBeacon = beacon as? CLBeacon
    }
}

Objective-C

CLBeacon *closestBeacon = nil;

for (CLBeacon *beacon in beacons) {

    if (closestBeacon == nil || beacon.rssi < 0 && beacon.rssi > closest.rssi) {

        closestBeacon = beacon;

    }
}

我也修复了原帖中的错误。

【讨论】:

  • 让我试着回到你身边。在您的回答中,最接近的信标是信标吗?或需要获取另一个 CLBeacon 属性。否则编译器会抛出错误。
  • 我编辑了答案。为了与 swift 版本保持一致,我将变量命名为 closeBeacon
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2013-04-21
相关资源
最近更新 更多