NSP Предикат для фильтрации маяка в соответствии с UUID, исключение для основного и незначительного повышения

У меня есть массив маяков, содержащий коллекцию CLBeacon, и я хотел бы получить только маяк, который соответствует указанному uuid, мажорному и минорному в NSPredicate. Ниже приведен код в объекте 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, мажорному и минорному?

1 ответ

Решение

Ошибка ясна: A 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"];
Другие вопросы по тегам