dispatch_async抛出NSPathStore2错误

时间:2012-12-22 04:22:21

标签: iphone objective-c xcode ios5

我正在调用抛出异常错误的类别中的函数:

-[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没有帮助。

2 个答案:

答案 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:的目的。