Неизвестная ошибка селектора при записи значений словаря в файл в iOS

Я читаю массив объектов ALAsset (обозначенных как NSMutableArray *assets; в заголовочном файле). Я пытаюсь следовать этот пример, чтобы распечатать содержимое словаря ALAssets в файл, который будет извлечен позже. Обратите внимание, что я могу правильно записать ключ словаря в файл (закомментировать), но не значение.

Вот мой код, который запускается в конце метода viewDidLoad():

// Create path to Documents
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

if ([paths count] > 0) {
    NSString *dictPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"dict.out"];
    NSDictionary *aDict = [[assets objectAtIndex:0] valueForProperty:ALAssetPropertyURLs];

    for (id key in aDict) {
        NSLog(@"key: %@, value: %@", key, [aDict valueForKey:key]);  
        //[key writeToFile:dictPath atomically:YES];        <- THIS LINE WORKS
        [[aDict valueForKey:key] writeToFile:dictPath atomically:YES];            
    }
}
else
    NSLog(@"nope");    // The program doesn't get here.

Лог выглядит так:

2011-11-17 23:44:41.340 Ключ PhotoApp[542:12803]: public.jpeg, значение: assets-library://asset/asset.JPG?id=1000000001&ext=JPG

2011-11-17 23:44:41.361 PhotoApp[542:12803] -[NSURL writeToFile:atomically:]: нераспознанный селектор отправлен экземпляру 0x6455650

2011-11-17 23:44:41.370 PhotoApp[542:12803] * Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[NSURL writeToFile:atomically:]: нераспознанный селектор отправлен в экземпляр 0x6455650'


Изменить: не уверен, имеет ли это значение, но проект предназначен для iPad и работает на симуляторе.


person gary    schedule 18.11.2011    source источник


Ответы (2)


Метод writeToFile:atomically: доступен только для NSDictionary и NSArray. На самом деле у вас есть объекты NSURLs в словаре aDict. Даже для NSString это устарело.

Поскольку вы получаете URL-адреса, получите от них абсолютную строку NSURL (которая возвращает NSString) и запишите их в файл, используя writeToFile:atomically:encoding:error:

В противном случае вы можете записать сам объект aDict (NSDictionary) в файл.

person Ilanchezhian    schedule 18.11.2011
comment
Спасибо. Я так понимаю, нет способа изменить тип объекта NSURL? - person gary; 18.11.2011
comment
Это работает, но запись объекта NSDictionary может быть приятнее, особенно при обратном чтении из файла. Ссылка в моем вопросе показывает это для словаря строк (который я мог бы воспроизвести), но я не смог сделать это для своего словаря. Должна ли реализация быть одинаковой? - person gary; 18.11.2011

Проблема в [[aDict valueForKey:key] writeToFile:dictPath atomically:YES]; строке.

as in key: public.jpeg, value: assets-library://asset/asset.JPG?id=1000000001&ext=JPG

вы получаете ключ как public.jpeg и значение как

asassets-library://asset/asset.JPG?id=1000000001&ext=JPG

который является объектом NSURL, поэтому при использовании.

[[aDict valueForKey:key] writeToFile:dictPath atomically:YES];

код, затем [aDict valueForKey:key] возвращает NSURL объект, который не распознает writeToFile: метод.

person Ravin    schedule 18.11.2011