2013-06-24 4 views
1

Это только что произошло. Я не знаю, как лучше всего обрабатывать такие случаи: я извлекаю объект с диска, в этом случае я знаю, что он должен быть только типа NSDictionary , Но это не хорошая практика кодирования, чтобы делать предположения, поэтому ... является нормой, чтобы проверить, какой класс она есть, а затем преобразовать ее в словарь?Obj-C Персистирование и динамическая проверка типов

Если да, то я должен сначала получить файл в классе NSData, а затем спросить, является ли он классом NSDictionary?

NSString *destinationString = [NSString stringWithFormat:@"%@/%@",dataPath,filename]; 

    NSDictionary *file = [[NSDictionary alloc]initWithContentsOfFile:destinationString]; 
    if (file) { 
     return YES; 
    } 
    return NO; 
} 
+0

Вы посмотрели на [NSUserDefaults] (http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html)? –

+0

@Marcus: Я собираюсь использовать NSUserDefaults для выполнения очень простой условной проверки. Но для этого мне нужно было что-то лучше. –

ответ

3

Вы не знаете, как реализован initWithContentsOfFile. Скорее всего, он проверяет начало файла, чтобы узнать, соответствует ли он словарю, и поручается раньше, если это не так (возвращается nil). Это может быть намного эффективнее, чем получение данных в первую очередь.

В соответствии с документами для initWithContentsOfFile, метод проверяет тип данных, содержащихся в файле, и не возвращает вам «плохой» или «неправильный» объект, поэтому вы можете быть уверены, что объект, отличный от нуля, хорошо.

Нужно ли вашему коду попробовать создать массив, а затем словарь - это другое дело.

3

Реализация настойчивости в том, как вы описываете, довольно хрупка. Любое небольшое изменение может нарушить ваше решение о сохранении и ввести непредвиденные ошибки. Если вам нужна легкая нагрузка, вы можете взглянуть на Mantle from Github. Mantle позволяет создать типизированную сериализуемую модель, которую вы можете легко сохранить в файл и прочитать. Кроме того, он поддерживает управление версиями, что крайне важно, если вы должны развивать свою модель с течением времени.

+0

Это хрупкое да, но поскольку внутренние словари используют словари, я могу обернуть любые классы внутри этого словаря, а затем добавить в кеш. Это просто небольшое приложение, чтобы оно могло пережить некоторые изменения. –

2

Персидские модели первого класса, которые имеют смысл для вашего приложения. Внесите NSCoding и используйте NSKeyedArchiver и NSKeyedUnarchiver. Или, как предлагает @allprog, идите с Mantle, это фактически то, что они делают, они просто делают для вас менее шаблонный код.