短い:任意のオブジェクト(要素のメンバーシップだけでなく、要素の順序も一意性を決定する)の一意の不変配列(固定長ですが、実行時に選択されます)を保持するキーによってコアデータオブジェクト
を見つける必要があります。ただし、NSManagedObjectはオーバーライドを禁止します。それで? [isEqual:]
ロング:
コアデータモデルにエンティティ(エンティティ「…リンク」の図の画像を参照)があり、属性キー(「タプル」)に基づいて一意性を保証する必要があります。ここまでは順調ですね。
ただし、エンティティの一意の属性はNSArrayである必要があります。
そして、物事をもう少し難しくするために、私はタプルの要素のクラスタイプも知りません。
また、タプルの要素数もわかりません。実際、カウントはすべてのタプルで同じです(少なくともコアデータコンテキストごと)が、アプリが実行される前はわかりません。
特定のタプルを持つリンクエンティティのインスタンスは1つだけでなければなりません。
そして明らかな理由で、任意のオブジェクトの特定の配列を持つタプルインスタンスは1つだけです。一方、が返さ
れる場合、2つのタプルは等しいと見なされます。 NSManagedObjectは、オーバーライドを禁止しますが、それ以外の場合は、物事はかなり簡単になります。[tuple_1 isEqual:tuple_n]
YES
[isEqual:]
[hash]
「…Tuple」オブジェクトは、トークンの配列とともに(便利なメソッドを介して)作成され、不変です(したがって、各「…Token」とそのデータ属性も不変です)。(「…Tuple」を「…Link」の辞書キーと考えてください。)
「 …Tuple」は、「…TokenOrder」の「order」キーに基づいて、きちんと順序付けられたトークンの配列"- (NSArray *)tokens;"
を返すを実装します。(タプルには最大5つの要素が含まれると予想されます。)
ただし、「…Link」オブジェクトは数万(場合によってはさらに多く)あると予想されます。これらのオブジェクトは、「タプル」属性に基づいて(頻繁に)検索する必要があります。
悲しいことに、私はそのようなシナリオの記事(解決策は言うまでもなく)を文献やウェブで見つけることができませんでした。
何か案は?
私がこれまでに思いついた可能な解決策は次のとおりです。
「…Tuple」に「」と呼ばれる別の属性を追加することにより、タプルで比較する要素の数が少なくなります。
tupleHash
これは、オブジェクトの作成時に次の方法で事前に計算されます。スニペット1NSPredicateを使用して、一致するtupleHashのオブジェクトをクエリします(候補のリストをかなり絞り込みます)。
絞り込まれた候補リストで、指定されたタプルを特徴とする「…Link」を検索します。Snippet1
スニペット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];
}]];
(申し訳ありませんが、マークダウンはリストとコードスニペットの混合に反対しているようです。)
良いアイデアですか、それとも非常識ですか?
前もって感謝します!