Here is a code sample I just wrote up, that should solve your filtration question.
I'm still learning the intricacies of NSFetchRequest and predicates, although it's not very complicated, after reading the documentation and experimenting.
NSArray *setoftags = [NSArray arrayWithObjects: @"AAA", @"BBB", nil];
NSFetchRequest * request;
NSMutableSet *tagcategoriesset = nil;
for (NSString *tag in setoftags) {
request = [NSFetchRequest fetchRequestWithEntityName:@"ObjectWithCategories"];
NSPredicate *tagPredicate = [NSPredicate predicateWithFormat:@"%K == %@", @"Tag", tag];
request.predicate = tagPredicate;
NSArray *objects;
NSError *err;
NSMutableSet *tagcategories = [[NSMutableSet alloc] initWithCapacity:1];
if ( (objects = [self.managedObjectContext executeFetchRequest:request error:&err]) == nil) {
// error
NSLog(@"There was an error:\n%@", [err localizedDescription]);
}
else {
// fetch request succeeded
// Ignore any unused tags
if ( [objects count] == 0) continue;
// Collect the Category attribute into a mutable set
for(NSManagedObject *obj in objects) {
[tagcategories addObject: [(id)obj Category]];
}
// First assign, later intersect the tagcategories
if (tagcategoriesset == nil) {
tagcategoriesset = tagcategories;
}
else {
[tagcategoriesset intersectSet: tagcategories];
}
}
}
NSArray *finalCategories = [tagcategoriesset allObjects];
Here's another SO Q&A for further discussion: using NSPredicate with a set of answers