In trying to delete some objects from Core Data, I am running into some difficulty using the NSMutableIndexSet class and it's method 'addIndex:'.
In core data I have folder objects, which contain a set of thread objects. Each thread has a threadId attribute which is a uint64_t. I am trying to create a mutable index set of these thread ids so that I can enumerate through them to delete their associated threads.
When I start trying to add my threadId's to my mutable index set, I get a crash with the following error:
[NSMutableIndexSet addIndexesInRange:]: Range {3982867280, 1} exceeds maximum index value of NSNotFound - 1'
This doesn't make sense since I am not calling the method 'addIndexesInRange:' as the error suggests.
Also, the 'addIndex:'takes an NSUInteger argument, but from what I'm reading, this should be interchangeable with the uint64_t.
Here is the code:
- (void)removeAllThreadsForFolder:(Folder *)folder
{
NSError *error;
NSArray *threads = [self fetchThreadsForFolder:folder error:&error];
NSMutableIndexSet *threadIds = [NSMutableIndexSet new];
for (Thread *thread in threads) {
uint64_t threadId = thread.threadId; //the threadId does exist
[threadIds addIndex:threadId]; //CRASH HERE!!!!!!!!!!!!!!!!!
}
[threadIds enumerateIndexesUsingBlock:^(NSUInteger threadId, BOOL *stop) {
[self removeThreadForFolder:folder threadId:threadId];
}];
[self saveContext:&error];
NSLog(@"folder now has %i threads", folder.threads.count);
}
Can anyone tell me what I am doing incorrectly and perhaps how to fix? Thanks
The
NSMutableIndexSet addIndex:
method expects a type ofNSUInteger
which is anunsigned long
.When building a 32-bit app, this is a 32-bit value. When you build for 64-bit, it is a 64-bit value.
Your
threadId
is a 64-bit value. Unless you are building a 64-bit iOS app, it is possible that many of the possible thread id values will be too large to fit in the 32-bitNSUInteger
value, hence the error.Why are you using an index set to hold a set of thread ids? Why not use a
NSMutableSet
orNSMutableArray
?Then you can do: