带有 CLRegion 对象的 NSSet

Posted

技术标签:

【中文标题】带有 CLRegion 对象的 NSSet【英文标题】:NSSet with CLRegion Objects 【发布时间】:2013-05-12 15:43:01 【问题描述】:

我有两套使用

NSMutableSet *monitoredRegionSet = [[locationManager monitoredRegions]mutableCopy];

另一个是使用

获得的
NSMutableSet *regionSet = [NSMutableSet setWithCapacity:regionChunks.count];
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:coordinate radius:radius        
identifier:regionString];
[regionSet addObject:region];

当我尝试在它们之间设置操作时它不起作用。我是否应该实现一个 CLRegion 类别并实现 isEqual: 和 hash: 方法。有没有更好的方法来做到这一点。

[monitoredRegionSet intersectSet:regionSet];
[monitoredRegionSet minusSet:regionSet];

【问题讨论】:

什么是“它们之间的集合操作”? 我试过 minusSet: 和 intersectSect: 但它们都不起作用。 你能把操作代码贴出来吗? How to compare two NSSets based on attributes of objects?的可能重复 【参考方案1】:
CLRegion *region = 
    [[CLRegion alloc] initCircularRegionWithCenter:coordinate 
        radius:radius        
    identifier:regionString];

这是一个全新的、不同的区域对象。在没有任何内置的区域相等概念的情况下,可以保证包含此区域对象的集合与先前存在的区域对象集合之间没有交集。

正如您正确暗示的那样,您可以使用 CLRegion isEqual:hash。但这真的是你想做的事吗?一个更好的问题可能是:您实际上想在这里完成什么?例如,直接从第一个集合中绘制第二个集合的区域可能更合适、更简单。

编辑:您最简单的方法可能是这样的:

https://***.com/a/7197192/341994

只需停止监控所有区域并从一组新区域重新开始(当然,其中一些区域可能恰好与您已经监控的区域相同)。 p>

【讨论】:

我将区域信息作为字符串获取,我使用它解析和构建区域。我需要停止监视不再有效的区域并开始监视新的区域。 因此,给定区域信息,只需枚举第一组并查看是否已经存在等效区域。 或者只是停止监视您正在监视的所有内容并重新开始,正如我在编辑的答案中所建议的那样。保持简单。 是的,可以做到,但由于可能有很多区域,我试图优化这部分代码。 不要过早优化! CLRegion 非常轻量级,只不过是一个结构。这里没有什么可以优化的。当您真正遇到速度/内存问题时保存优化。

以上是关于带有 CLRegion 对象的 NSSet的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 来判断 NSSet 是不是包含来自另一个 NSSet 的对象 [重复]

iOS:跟踪 NSSet 对象的序列

用 CoreData 对象填充 NSSet

将核心数据对象设置为 NSSet

Core Data NSSet 对象的 NSSortdescriptor

如何从包含任意对象的 NSSet 创建排序的 NSArray?