NSPredicate根据UUID,主要和次要引发异常来过滤信标

时间:2018-08-09 12:32:23

标签: nspredicate ibeacon nscompoundpredicate clbeacon

我有一个包含CLBeacon集合的 beacons 数组,我只想获取与NSPredicate中给定的uuid,major和minor匹配的信标。下面是对象C中的代码,该代码由于谓词中的UUID而生成异常。如果我从查询中删除uuidPredicate,则代码可以正常工作。

 - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray<CLBeacon *> *)beacons inRegion:(CLBeaconRegion *)region{

        NSPredicate *uuidPredicate = [NSPredicate predicateWithFormat:@"uuid.UUIDString == [c] %@", @"03672ce6-9272-48ea-ba54-0bf679217980"];
       //NSPredicate *uuidPredicate = [NSPredicate predicateWithFormat:@"uuid == %@", @"03672ce6-9272-48ea-ba54-0bf679217980"];
        NSPredicate *majorPredicate = [NSPredicate predicateWithFormat:@"major = %ld", 1];
        NSPredicate *minorPredicate = [NSPredicate predicateWithFormat:@"minor = %ld", 3];

        NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[uuidPredicate, majorPredicate, minorPredicate]];

        NSArray *pointABeacon = [beacons filteredArrayUsingPredicate:compoundPredicate];   

    }

信标数组类似于

beacons (
    "CLBeacon (uuid:03672CE6-9272-48EA-BA54-0BF679217980, major:1, minor:1, proximity:1 +/- 0.07m, rssi:-61)",
    "CLBeacon (uuid:03672CE6-9272-48EA-BA54-0BF679217980, major:1, minor:2, proximity:1 +/- 0.07m, rssi:-62)",
    "CLBeacon (uuid:03672CE6-9272-48EA-BA54-0BF679217981, major:1, minor:3, proximity:2 +/- 1.64m, rssi:-53)"
)

例外是

  

***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[ valueForUndefinedKey:]:此类为   不符合密钥uuid的密钥值编码要求。'

如何使用uuid,major和minor三个参数过滤数组?

1 个答案:

答案 0 :(得分:1)

错误很明显: CLBeacon对象没有名为uuid的属性。

打印CLBeacon对象时,您可能会看到“ uuid”,但这不是属性的真实名称,而是proximityUUID

所以:

NSPredicate *uuidPredicate = [NSPredicate predicateWithFormat:@"uuid.UUIDString == [c] %@", @"03672ce6-9272-48ea-ba54-0bf679217980"];

应为:

NSPredicate *uuidPredicate = [NSPredicate predicateWithFormat:@"proximityUUID.UUIDString == [c] %@", @"03672ce6-9272-48ea-ba54-0bf679217980"];