Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert a object into dictionary to save as plist: property list invalid format

I want to save to disk an array of objects as plist file .

First I convert the array of objects into an array of equivalent dictionaries. With some properties there is no problem but some of then give errors. Now I'm trying to get the url property error. (The commented lines are also problematic but I'm not working on then now.

HEre is the interface of YOEvento class.

#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

The code to convert the array

        // 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];

After the last instructions I get in errorDesc the error "property list invalid format". The contents of the dictionary seem to be valid. Here is a log of the contents in runtime:

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
}
like image 760
David Casillas Avatar asked Feb 22 '23 15:02

David Casillas


1 Answers

Property lists can only contain objects of a small number of classes: namely, NSString, NSDate, NSNumber, NSArray, NSDictionary, NSData. If you want to represent other types (such as NSURL) in a property list, you have to convert it to one of the permitted types first.

like image 110
Ole Begemann Avatar answered Apr 09 '23 13:04

Ole Begemann