我正在调用抛出异常错误的类别中的函数:
-[NSPathStore2 countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x1f5572b0
错误正在此块中抛出。
NSArray *shindys = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSError *error = nil;
__weak UIManagedDocument *shindyDatabase = self.shindyDatabase;
dispatch_queue_t downloadQueue = dispatch_queue_create("Shindy Fethcer", nil);
dispatch_async(downloadQueue, ^{
for (NSDictionary *shindyInfo in shindys) {
[Shindy shindyWithShindyDBInfo:shindyInfo inManagedObjectContext:shindyDatabase.managedObjectContext];
[shindyInfo setValue:self.detailView.text forKey:@"details"];
NSLog(@"This is getting performed.");
}
});
预先分配NSDictionary
没有帮助。
答案 0 :(得分:2)
'shindys'不是NSArray。如果你停止调用-objectAtIndex:,那就是。
答案 1 :(得分:1)
在封面下,for(element in container)
循环使用countByEnumeratingWithState:objects:count:
消息来枚举容器的元素。
NSPathStore2
类是NSString
的子类,系统将其用于已知为文件系统路径的字符串。
异常消息告诉您NSPathStore2
不支持countByEnumeratingWithState:objects:count:
消息。
这是有道理的,因为NSString
(和NSPathStore2
子类)不是对象容器。
NSSearchPathForDirectoriesInDomains
函数确实返回NSArray
(这是一个可以在for/in
循环中使用的对象容器),但是你正在挑选数组的第一个元素(使用NSPathStore2
的{{1}}实例)。因此,即使您将objectAtIndex:
声明为shindys
,您实际上也会将其设置为NSArray
。
您调用NSPathStore2
的方式,它将始终返回1个元素的数组,因此使用NSSearchPathForDirectoriesInDomains
选择其第一个元素的想法很好。没有理由尝试枚举其所有元素,因为它只有一个元素。
此外,在您的区块中,您要向objectAtIndex:
发送setValue:forKey:
,期望shindyInfo
成为字典。但即使shindyInfo
是一个数组,它也是一个字符串数组,因为这是shindys
返回的内容。并且字符串没有您可以使用NSSearchPathForDirectoriesInDomains
设置的任何属性。
这段代码很乱。目前尚不清楚你要做什么,但我认为你不理解setValue:forKey:
的目的。