2013-11-20 2 views
1

В методе мне нужно прочитать NSArray или NSDictionary из файла plist.NSArray или NSDictionary из файла plist

Вот моя проблема: как я могу создать NSArray ИЛИ NSDictionary из файла plist, когда я не знаю, если это массив или словарь в нем?

Я знаю, что я могу сделать:

NSArray *myArray = [NSArray arrayWithContentsOfFile:filePath]; 

или

NSDictionary *myDico = [NSDictionary dictionaryWithContentsOfFile:filePath]; 

Но я не знаю, если Filepath содержит NSArray или NSDictionary. Я бы хотел что-то вроде:

id myObject = [... ...WithContentOfFile:filePath]; 

Может кто-нибудь помочь мне и дать мне лучший способ сделать это?

ответ

6

Вот как

NSData *data = [NSData dataWithContentsOfFile:filePath]; 
id obj = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:nil]; 

if([obj isKindOfClass:[NSDictionary class]]) { 
    //cast obj to NSDictionary 
} 
else if([obj isKindOfClass:[NSArray class]]) { 
    //cast obj to NSArray 
} 
+1

Он также отлично работает! Спасибо ! – Jonathan

1

Вы можете использовать метод isKindOfClass для определения того, какой класс является таковым. Вы должны загрузить .plist файл с помощью:

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
plistPath = [rootPath stringByAppendingPathComponent:@"Data.plist"]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { 
    plistPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 
} 

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
id objectFromPlist = [NSPropertyListSerialization 
    propertyListWithData:plistXML 
    options:0 
    format:&format 
    errorDescription:&errorDesc]; 

И вы можете проверить здесь:

if([objectFromPlist isKindOfClass:[NSArray class]]) 
{ 
    NSArray* plistArray = (NSArray*) classFromPlist; 
} 
+0

Спасибо за ваш ответ, но как я могу получить объект классаFromPlist? – Jonathan

+0

Обновлен мой ответ с дополнительными советами. –

+0

Спасибо! Он отлично работает! Но страница [link] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nspropertylistserialization_Class/Reference/Reference.html#//apple_ref/occ/clm/NSPropertyListSerialization/ свойствоListWithData: options: format: error) сказал, что он будет устаревшим в ближайшее время. – Jonathan

Смежные вопросы