Чтение plist из памяти в NSDictionary - PullRequest
0 голосов
/ 07 марта 2012

Согласно этому сообщению я могу использовать методы шифрования / дешифрования для безопасного хранения / извлечения файла plist .

Но проблема в следующем:

В: После того, как я расшифровал файл plist, как я могу проанализировать и сохранить файл plist как NSDictrionary объект

Ответы [ 4 ]

0 голосов
/ 02 сентября 2012

Одна из возможных причин dictionaryWithData не существует - список свойств не обязательно является словарем на корневом уровне.В равной степени это может быть NSArray.

Вот мое решение: категория, использующая NSPropertyListSerialization

Функции

  • Молча отбрасывает данные, содержащие массивы вкорневой уровень.
  • Проверяет, какой метод использовать (propertyListFromData: mutabilityOption: format: errorDescription: устарел)

  • NSMutableDictionary также поддерживается

Примечание. Для этого используется неортодоксальный подход - обертывание метода фабрики классов методом init.Это для эффективности - большую часть времени вы будете использовать фабричный метод, который просто оборачивает NSPropertyListSerialization, который внутренне вызывает alloc / init / autorelease для возврата соответствующего объекта.

NSDictionary + DictionaryWithData.h

#import <Foundation/Foundation.h>

@interface NSDictionary (DictionaryWithData)
+ (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end

NSDictionary + DictionaryWithData.m

#import "NSDictionary+DictionaryWithData.h"



@implementation NSDictionary (DictionaryWithData)
+(NSPropertyListMutabilityOptions) mutabilityOption {
    return NSPropertyListImmutable;
}

+ (id)dictionaryWithData:(NSData *)data
{
    static BOOL methodChecked = NO;
    static BOOL use_propertyListWithData = NO;
    if (!methodChecked) {
        SEL sel = @selector(propertyListWithData:options:format:error:);
        use_propertyListWithData = [[NSPropertyListSerialization class]
                                    respondsToSelector:sel];
        methodChecked = YES;
    }

    id result;

    if (use_propertyListWithData) {

         result =  [NSPropertyListSerialization propertyListWithData:data
                                                         options:[self mutabilityOption]
                                                          format:nil
                                                           error:nil];

    } else {

         result =  [NSPropertyListSerialization propertyListFromData:data
                                                mutabilityOption:[self mutabilityOption]
                                                          format:NULL
                                                errorDescription:nil];
    }

    return  [result isKindOfClass:[NSDictionary class]] ? result : nil;
}

- (id)initWithData:(NSData *)data
{
    id result = [[self class] dictionaryWithData:data];
    self = result ? [self initWithDictionary:result ] : nil;
    return  self;
}
@end

@implementation NSMutableDictionary (DictionaryWithData)
+(NSPropertyListMutabilityOptions) mutabilityOption {
    return NSPropertyListMutableContainersAndLeaves;
}
@end
0 голосов
/ 07 марта 2012

Здесь можно использовать базовый базовый подход с методом CFPropertyListCreateFromXMLData

Если plist представляет содержимое NSDictionary, должна быть пройдена следующая проверка:

if ([(id)plist isKindOfClass:[NSDictionary class]])

и объект plist может быть безопасно приведен к NSDictionary.Если нет, то что-то не так с процессом обработки данных или расшифровки.

0 голосов
/ 07 марта 2012

Самый простой способ - создать категорию для NSDictionary, например:

NSDictionaryWithData.h:

@interface NSDictionary (NSDictionaryWithData)
+ (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end

NSDictionaryWithData.m:

@implementation NSDictionary (NSDictionaryWithData)

+ (id)dictionaryWithData:(NSData *)data
{
  return [[[NSDictionary alloc] initWithData:data] autorelease];
}

- (id)initWithData:(NSData *)data
{
  self = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:data
                                                          mutabilityOption:NSPropertyListImmutable
                                                                    format:NULL
                                                          errorDescription:nil];
  return [self retain];
}

@end

Использование:

NSDictionary* myDict = [[NSDictionary alloc] initWithData:decryptedData];
0 голосов
/ 07 марта 2012

Возможно NSPropertyListSerialization - это то, что вы ищете.

Как видно из этого поста: Plist Array для NSDictionary

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...