Преобразовать объект в словарь, чтобы сохранить как plist: неверный формат списка свойств - PullRequest
4 голосов
/ 19 октября 2011

Я хочу сохранить на диск массив объектов в виде plist-файла.

Сначала я конвертирую массив объектов в массив эквивалентных словарей.С некоторыми свойствами проблем нет, но некоторые из них дают ошибки.Теперь я пытаюсь получить ошибку свойства url.(Закомментированные строки также проблематичны, но сейчас я не работаю над ними.

Вот интерфейс класса YOEvento.

#import <MapKit/MapKit.h>

@interface YOEvento : NSObject

{
    NSURL *url; // <url>
    NSInteger identificador; // <identificador>
    NSString *nombre; // stores the <name> tag
    NSDate *diaDeInicio; // stores the tag <dia-de-inicio>
    NSDate *diaDeFin; // stores the tag <dia-de-fin>
    NSString *entradilla; // stores the tag <entradilla>
    NSURL *foto; // <foto>
    CLLocationCoordinate2D localizacion; // <localizacion>
    BOOL isFavourite;
}

@property (nonatomic, retain) NSURL *url;
@property NSInteger identificador;
@property (nonatomic, retain) NSString *nombre;
@property (nonatomic, retain) NSDate *diaDeInicio;
@property (nonatomic, retain) NSDate *diaDeFin;
@property (nonatomic, retain) NSString *entradilla;
@property (nonatomic, retain) NSURL *foto;
@property CLLocationCoordinate2D localizacion;
@property BOOL isFavourite;

@end

Код для преобразования массива

        // 1. Convert array of YoEvento in array of Dictionary to be able to save as plist

    NSMutableArray *tempArray = [NSMutableArray array];
    for (YOEvento *evento in self.eventosFavouritesAppDel) {
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:
                                                                  evento.url,
//                                                                  evento.identificador,
                                                                  evento.nombre,
                                                                  evento.diaDeInicio,
                                                                  evento.diaDeFin,
                                                                  evento.entradilla,
//                                                                  evento.foto,
//                                                                  evento.localizacion,
                                                                  nil]
                                                         forKeys:[NSArray arrayWithObjects:
                                                                  kURLElement,
//                                                                  kIdentificadorElement,
                                                                  kNombreElement,
                                                                  kDiaDeInicioElement,
                                                                  kDiaDeFinElement,
                                                                  kEntradillaElement,
//                                                                  kFotoElement,
//                                                                  kLocalizacionElement,
                                                                  nil]];
        [tempArray addObject:dict];
    }
        // 2. Convert the array to NSData
    NSString *errorDesc;
    NSData *data = [NSPropertyListSerialization dataFromPropertyList:tempArray format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc];

После последних инструкций я получаю в errorDesc сообщение об ошибке «Недопустимый формат списка свойств». Содержимое словаря является допустимым. Вот журнал содержимого во время выполнения:

Printing description of dict:
<CFBasicHash 0x5b99170 [0x1298400]>{type = immutable dict, count = 5,
entries =>
    0 : <CFString 0xfd00 [0x1298400]>{contents = "entradilla"} = <CFString 0x5b99b10 [0x1298400]>{contents = "Festival Internacional de Cine de Gij\u00f3n  M\u00e1s informaci\u00f3n en  www.gijonfilmfestival.com "}
    2 : <CFString 0xfcd0 [0x1298400]>{contents = "nombre"} = <CFString 0x5b99590 [0x1298400]>{contents = "49 FICXix\u00f3n - Festival Internacional de Cine de Gij\u00f3n"}
    4 : <CFString 0xfcb0 [0x1298400]>{contents = "url"} = <CFURL 0x5b992f0 [0x1298400]>{type = 15, string = http://www.gijon.es/eventos/show/18753-49-ficxixon-festival-internacional-de-cine-de-gijon, encoding = 134217984, base = (null)}
    5 : <CFString 0xfcf0 [0x1298400]>{contents = "dia-de-fin"} = 2011-11-26 22:59:00 +0000
    6 : <CFString 0xfce0 [0x1298400]>{contents = "dia-de-inicio"} = 2011-11-18 22:59:00 +0000
}

1 Ответ

8 голосов
/ 19 октября 2011

Списки свойств могут содержать только объекты небольшого числа классов: а именно, NSString, NSDate, NSNumber, NSArray, NSDictionary, NSData.Если вы хотите представить другие типы (например, NSURL) в списке свойств, сначала необходимо преобразовать его в один из разрешенных типов.

...