Во-первых, было бы полезно увидеть вашу модель данных, но я предполагаю, что вы делаете что-то вроде:
Person <-->> TeamMember <<--> Team
Я понимаю, что вы видели это в документах (которые, как правило, усложняют простые вещи по неизвестным причинам), я должен спросить; почему ты это делаешь? Если нет данных, специфичных для этого объекта TeamMember, то вы можете просто сделать:
Person <<-->> Team
Во-вторых, ваш предикат неверен и, вероятно, не нужен. Поскольку у вас уже есть ссылка на этого человека, вы можете напрямую запросить команды, в которые он входит:
NSSet *teams = [person valueForKeyPath:@"teamMembers.@distinctUnionOfSets.team"];
Что вернет вам набор командных объектов. Однако если вы удалите объект TeamMember, вы можете упростить этот запрос с помощью:
NSSet *teams = [person valueForKey@"teams"];
Поскольку в Core Data используется NSSet
, а не NSArray
, вам даже не нужно беспокоиться о дублировании на этом уровне, потому что если вы попытаетесь добавить одну и ту же команду в набор более одного раза, она будет проигнорирована.
И чтобы завершить ответ, проблема с вашим предикатом заключается в том, что вы не можете смешивать IN и ALL в предикате против Базовых данных. Это известное ограничение. Поэтому я рекомендую использовать подход, описанный выше.