Я думаю, что вы подходите к проблеме задом наперед.Если у вас есть ключевые слова, вы должны найти объекты Keyword
, а затем пройти их отношения A
, чтобы найти связанные объекты A
. Затем проверьте наложение в наборах отношений.
Итак, что-то вроде:
NSFetchRequest *fetch=//...set up fetch
[fetch setEntity:Keyword_entity];
NSPredicate *p=[NSPredicate predicateWithFormat:@"keyword IN %@",keywords];
[fetch setPredicate:p];
NSArray *fetchedObj=//... execute fetch
NSMutableSet *inCommon=[NSMutableSet setWithCapacity:[fetchedObjs count]];
for (NSManagedObject *mo in fetchedObjs){
if ([inCommon count]==0){
[inCommon addObjects:[mo valueForKey:@"aRelationshipName"]];
}else{
[inCommon intersectSet:[mo valueForKey:@"aRelationshipName"]];
}
}
... inCommon
будет содержать набор всех уникальных A
объектов, которые разделяют все ключевые слова.
Update:
От автора OP:
Это не совсем решает проблему, так как результаты, возвращаемые при пересечении fetchedObjs, неверны.Это не гарантирует, что все объекты 'A' содержат все предоставленные ключевые слова.
Хорошо, давайте возьмем другую тактику.Предположим, у вас есть модель данных, которая выглядит примерно так:
A {
keywords<<-->>Keyword.as
}
Keyword{
keyword:string
as<<-->>A.keywords
}
Тогда что-то вроде этого должно работать:
NSFetchRequest *keyWordFetch=//...set up fetch
[keyWordFetch setEntity:Keyword_entity];
NSPredicate *p=[NSPredicate predicateWithFormat:@"keyword IN %@",keywords];
[keyWordFetch setPredicate:p];
NSArray *fetchedKeywords=//... execute keyWordFetch
NSFetchRequest *entityAFetch=//...set up fetch
[entityAFetch setEntity:A_entity];
NSPredicate *pred=[NSPredicate predicateWithFormat:@"ALL keywords IN %@", fetchedKeywords);
[entityAFetch setPredicate:pred];
NSArray *fetchedAs=//... execute fetch