如何覆盖isEqual:对于CLBeacon?

时间:2015-05-26 13:33:42

标签: ios objective-c core-location equality

背景

我有一个由第三方库提供的方法,它返回一个CLBeacons数组。

- (void)beaconManager:(ESTBeaconManager *)manager
      didRangeBeacons:(NSArray *)beacons
             inRegion:(CLBeaconRegion *)region

此方法以固定间隔调用,并且数组包含范围内的信标列表。数组中的对象不会被重用,每次都会发送新的信标对象

我根据它们的接近度将这些对象添加到数组并将其删除。

问题

如何为isEqual:实施CLBeacon,以便像containsObject:removeObject:等数组方法在没有大量额外实现的情况下工作。

我无法进行子类化,因为CLBeacon作为CLBeacon返回,我无法将其转换为自定义类。

我无法编写类别,因为在运行时调用的isEqual:未定义。

  

如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(或甚至是超类)中的另一个类别中的方法相同,则行为未定义为哪个方法实现在运行时使用。如果您使用具有自己类的类别,则不太可能成为问题,但在使用类别向标准Cocoa或Cocoa Touch类添加方法时可能会导致问题。

[Source]

我真的不愿意采用方法调整。

1 个答案:

答案 0 :(得分:1)

创建一个全局函数beaconsAreEqual,它将2个CLBeacons作为输入并返回一个bool。

或者您是否需要定义isEqual方法?如果是这样,您可能 使用方法调整。

编辑:

或者你可以创建一个自定义的CLBeacon子类来覆盖isEqual(如果你想使用NSArray方法contains,可能是哈希)

然后为您的类创建一个自定义初始化程序,它将常规CLBeacon作为输入并复制相关信息(UUID,主要和次要版本号都是您应该需要的。)

完成后,您可以从位置管理器中获取信标,将其转换为自定义类,并将其保存到您的阵列中,并将其用于contains项检查。< / p>

编辑#2:

另一种选择是使用NSArray方法indexOfObjectPassingTest而不是。该方法将块作为参数,并返回整数索引,如果找不到该对象,则返回NSNotFound。

编辑#3:

看起来没有用于自己创建CLBeacon对象的初始化程序。您必须创建一个数据容器对象(NSObject的子类),以保存来自CLBeacon的信息。这对于检查信号是否已经存在于您的数组中是合适的