Monday, June 17, 2013

NSIndexSet enumerateRangesUsingBlock example in Objective C (iOS).

NSIndexSet enumerateRangesUsingBlock

Executes a given block using each object in the index set, in the specified ranges.

- (void)enumerateRangesUsingBlock:(void (^)(NSRange range, BOOL *stop))block

Parameters of [NSIndexSet enumerateRangesUsingBlock]
The block to apply to elements in the index set.
The block takes two arguments:
The range of objects of the elements in the index set.
A reference to a Boolean value. The block can set the value to YES to stop further processing of the array. The stop argument is an out-only argument. You should only ever set this Boolean to YES within the Block.

Discussion of [NSIndexSet enumerateRangesUsingBlock]
If the Block parameter is nil this method will raise an exception.

NSIndexSet enumerateRangesUsingBlock example.
You may want to look at NSMutableIndexSet. It is designed to efficiently store ranges of numbers.

You can initialize it like this:

NSMutableIndexSet *set = [[NSMutableIndexSet alloc]
    initWithIndexesInRange:NSMakeRange(1, 100000)];
Then you can remove, for example, 123 from it like this:

[set removeIndex:123];
Or you can remove 400 through 409 like this:

[set removeIndexesInRange:NSMakeRange(400, 10)];
You can iterate through all of the remaining indexes in the set like this:

[set enumerateIndexesUsingBlock:^(NSUInteger i, BOOL *stop) {
    NSLog(@"set still includes %lu", (unsigned long)i);
or, more efficiently, like this:

[set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) {
    NSLog(@"set still includes %lu indexes starting at %lu",
        (unsigned long)range.length, (unsigned long)range.location);

End of NSIndexSet enumerateRangesUsingBlock example article.