NSPredicate 'OR' filtering based on an NSArray of keys

Posted by So Over It on Stack Overflow See other posts from Stack Overflow or by So Over It
Published on 2012-06-20T08:13:54Z Indexed on 2012/06/20 9:16 UTC
Read the original article Hit count: 146

Filed under:
|
|
|

Consider the following NSArray:

NSArray *dataSet = [[NSArray alloc] initWithObjects:
                 [NSDictionary dictionaryWithObjectsAndKeys:@"abc", @"key1", @"def", @"key2", @"hij", @"key3", nil], 
                 [NSDictionary dictionaryWithObjectsAndKeys:@"klm", @"key1", @"nop", @"key2", nil], 
                 [NSDictionary dictionaryWithObjectsAndKeys:@"qrs", @"key2", @"tuv", @"key3", nil], 
                 [NSDictionary dictionaryWithObjectsAndKeys:@"wxy", @"key3", nil], 
                 nil];

I am able to filter this array to find dictionary objects that contain the key key1

// Filter our dataSet to only contain dictionary objects with a key of 'key1'
NSString *key = @"key1";
NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN self.@allKeys", key];
NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate];
NSLog(@"filteretSet1: %@",filteretSet1);

Which appropriately returns:

filteretSet1: (
        {
        key1 = abc;
        key2 = def;
        key3 = hij;
    },
        {
        key1 = klm;
        key2 = nop;
    }
)

Now, I am wanting to filter the dataSet for dictionary objects containing ANY of the keys in an NSArray.

For example, using the array: NSArray *keySet = [NSArray arrayWithObjects:@"key1", @"key3", nil]; I want to create a predicate that returns and array of any dictionary objects that contain either 'key1' or 'key3' (ie. in this example all dictionary objects would be returned except for the third object - as it does not contain either 'key1' or 'key3').

Any ideas on how I would achieve this? Would I have to use a compound predicate?

© Stack Overflow or respective owner

Related posts about objective-c

Related posts about ios