gpt4 book ai didi

objective-c - 通过数组属性在 Core Data 中查找对象,在 >10k 元素中高效查找

转载 作者:行者123 更新时间:2023-12-03 16:44:36 25 4
gpt4 key购买 nike

简短:
我需要通过一个键来查找核心数据对象,该键保存任意对象的唯一不可变数组(固定长度,但在运行时选择)(其中不仅>元素成员资格,而且元素顺序决定唯一性)。 NSManagedObject 但是禁止覆盖 [isEqual:]。现在怎么办?

<小时/>

长:
我的核心数据模型中有一个实体(请参阅实体“…Link”的图表图像),我必须根据属性键(“元组”)保证其唯一性。到目前为止一切顺利。

但是实体的唯一属性必须是NSArray
让事情变得更困难的是,我也不知道元组元素的类类型
我也不知道元组的元素计数。好吧,实际上每个元组的计数都是相同的(至少每个核心数据上下文),但在应用程序运行之前未知。

具有给定元组的链接实体必须只有一个实例
出于明显的原因,只有一个元组实例具有给定的任意对象数组。
而如果 [tuple_1 isEqual:tuple_n] 返回 YES,则两个元组被视为相等。 NSManagedObject 禁止覆盖 [isEqual:][hash],否则事情就小菜一碟了。

“…Tuple”对象与其标记数组一起创建(通过便捷方法)并且是不可变的(每个“…Token”及其标记也是如此)数据属性)。 (将“…Tuple”视为“…Link”的字典键。)

“…Tuple”实现了“- (NSArray *)tokens;”,它基于“的”order”键,返回一个整齐有序的 token 数组 …代币订单”。 (元组预计最多包含 5 个元素。)

然而,我预计有数万(在某些边缘情况下可能更多)“…链接”对象,我必须(经常)根据它们的“元组”找到它们“属性

遗憾的是,我在任何文献或网络中都找不到针对这种情况的任何文章(更不用说解决方案)。

有什么想法吗?

core data model

到目前为止我想出的一个可能的解决方案是:

  1. 要比较的元素数量较少通过添加另一个属性的元组到“…Tuple”,称为“tupleHash”,这是预先计算的通过以下方式创建对象:代码段 1

  2. 使用 NSPredicate 查询匹配 tupleHash 的对象(大大缩小候选列表范围)。

  3. 通过以下方式在缩小的候选列表中查找包含给定元组的“...Link”:代码段 1

代码片段 1:

NSUInteger tupleHash = [[self class] hash];
for (id token in self.tokens) {
tupleHash ^= [token.data hash];
}

代码片段 2:

__block NSArray *tupleTokens = someTokens;
NSArray *filteredEntries = [narrowedCandidates filteredArrayUsingPredicate:
[NSPredicate predicateWithBlock: ^(id evaluatedObject, NSDictionary *bindings) {
return [evaluatedObject.tuple.tokens isEqualToArray:tupleTokens];
}]];

(抱歉,Markdown 似乎反对将列表与代码片段混合。)

好主意还是疯了?

提前致谢!

最佳答案

我强烈建议您计算对象的哈希值并将其存储在数据库中。你的第二个片段会严重损害性能,这是肯定的。

更新:

你不需要使用NSArray的hash方法。要计算哈希值,您可以对串联的数组值执行 SHA1 或 MD5。哈希算法有很多种,这里只是其中两种。

您可以为 NSArray 创建一个类别,例如 myHash 以使代码可重用。

关于objective-c - 通过数组属性在 Core Data 中查找对象,在 >10k 元素中高效查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com