该类是 NSProxy
子类的一个子类,允许您有多个分配辅助对象(而不是分配者和分配者之间通常的 1 对 1 关系)。
您可以用您想要的任何数量的分配对象初始化 LBDelegateMatrioska
对象
LBDelegateMatrioska *matrioska = [[LBDelegateMatrioska alloc] initWithDelegates:@[mapClusterDelegate, self]];
并将此对象作为分配者添加
mapView.delegate = matrioska
这样,每当 MKMapView 调用分配者时,这个调用都会转发到所有分配者,并尊重数组排序(如果您喜欢马图斯卡隐喻,那么 mapClusterDelegate
是外部层,是第一个被调用的,然后是 self
)
代理对象对所有分配对象保持 弱引用,因此您有责任通过强引用保持对象活力。无论如何,通过使用 NSPointerArray
,我可以保证,如果一个分配者被解除分配,数组中的引用会被置为 nil,从而不会导致应用程序崩溃。
您只需记住两个基本规则和一个限制
YES
,则代理将响应对 respondToSelector:
消息的 YES
。conformsToProtocol:
void
返回方法,则仅调用第一个能够响应该方法的分配者(其返回值是返回的)。我开始开发这个类是因为我被分配去实现地图视口中的注释聚类。
我在网上发现了不同的库,但我对实现并不满意:很多库都通过子类或修改方法来修改 MKMapView
,以便在 -mapView:regionWillChangeAnimated:
和 -mapView:regionDidChangeAnimated:
方法调用中设置。
所以,关键是我不想摆弄分配者,但我想要在分配者的一个分配方法调用中设置(以地图为例:我还想能够接收所有的分配调用回到地图示例中:我还希望拥有 MKMapView 的 ViewController 能够接收所有的分配调用)。
我发现将类似插件注入分配者以分割处理分配器工作的能力非常有趣。再次以我的地图为例:我可以轻松地将聚类行为“插入”到任何 MKMapView 中(并最终插入其他行为以增强地图视图)。
该类包含单元测试覆盖率(使用Kiwi)。为了使用Kiwi并运行测试,您可能想运行pod install
然后打开工作区(而不是项目文件)。
LBDelegateMatrioska在MIT许可下可用。有关更多信息,请参阅LICENSE文件。