在尝试从Core Data中删除某些对象时,我使用NSMutableIndexSet类和它的方法'addIndex:'遇到了一些困难。
在核心数据中,我有文件夹对象,它包含一组线程对象。每个线程都有一个threadId属性,它是一个uint64_t。我正在尝试创建这些线程ID的可变索引集,以便我可以通过它们枚举来删除它们的关联线程。
当我开始尝试将我的threadId添加到我的可变索引集中时,出现以下错误导致崩溃:
[NSMutableIndexSet addIndexesInRange:]: Range {3982867280, 1} exceeds maximum index value of NSNotFound - 1'
这没有意义,因为我没有按照错误的建议调用方法'addIndexesInRange:'。
此外,'addIndex:'采用NSUInteger参数,但从我正在阅读的内容来看,这应该可以与uint64_t互换。
以下是代码:
- (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);
}
有谁能告诉我我做错了什么,也许怎么解决?感谢
答案 0 :(得分:1)
NSMutableIndexSet addIndex:
方法需要的NSUInteger
类型为unsigned long
。
构建32位应用程序时,这是一个32位值。当您为64位构建时,它是64位值。
您的threadId
是64位值。除非您正在构建64位iOS应用程序,否则许多可能的线程ID值可能太大而无法容纳在32位NSUInteger
值中,因此会出错。
为什么使用索引集来保存一组线程ID?为什么不使用NSMutableSet
或NSMutableArray
?
然后你可以这样做:
NSMutableSet *threadIds = [NSMutableSet set];
for (Thread *thread in threads) {
uint64_t threadId = thread.threadId; //the threadId does exist
[threadIds addObject:@(threadId)];
}
[threadIds enumerateObjectsUsingBlock:^(NSNumber *threadId, BOOL *stop) {
[self removeThreadForFolder:folder threadId:[threadId unsignedLongLongValue]];
}];