ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 3

15. Файловая система iOS

Знакомство с файловой системой iOS

Как и все современные операционные системы iOS имеет свою файловую систему. Но разработчик имеет доступ не ко всем ее функциям. Дело в том, что в iOS каждое приложение находится как бы в своей «песочнице». Текущее приложение не имеет доступ к другим установленным приложениям на устройстве. А если быть точнее — приложение имеет доступ только к своей «песочнице». При этом, записывать или изменять файлы можно осуществить только в папке документов (Documents) конкретного приложения. Остальные файлы доступны только для чтения.

В этом примере я хочу продемонстрировать возможность чтения файлов. Мы уже делали это в примере Подробней о парсинге. Там мы добавили в проект файл menu.xml.

<code data-result="[object Object]">NSString *filePath = [[NSBundle mainBundle] pathForResource:@"menu" ofType:@"xml"];</code>

 

Эта строка эквивалентна следующей:

<code data-result="[object Object]">NSString *filePath = [[NSBundle mainBundle] pathForResource:@"menu.xml" ofType:nil];</code>

 

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

<code data-result="[object Object]">NSData *myData = [NSData dataWithContentsOfFile:filePath];</code>

 

Теперь в переменной myData находится содержимое файла menu.xml и мы можем преступать к его дальнейшей обработке (парсингу).

В примере Более подробно о ячейках мы получали картинку с папки проекта:

<code data-result="[object Object]">cell.imageView.image = [UIImage imageNamed:@"home-ios-sdk.png"];</code>

 

Этот код эквивалентный следующему:

<code data-result="[object Object]">UIImage *image = [UIImage imageNamed:@"home-ios-sdk.png"];
cell.imageView.image = image;</code>

 

В результате выполнения первой строки в переменной image мы получим картинку имя которой указали в параметре метода imageNamed.

Для хранения массивов данных или словарей фирма Apple предлагает нам использовать *.plist-файлы. Фактически, этот тот же *.xml-файл, разница лишь в том, что *.plist Xcode умеет парсить сам. Кроме этого, для создания и редактирования *.plist-файла нам не нужен никакой специальный редактор, все это выполняется средствами Xcode в интерактивном режиме. Перед тем как начать работу с *.plist-файлами нам нужно создать проект, в который мы будем добавлять эти самые файлы. Я создал проект на основе представления (View-based Application) и назвал его FileSystemiOS.

Теперь нажмите правой кнопкой мышки на папку Supporting Files в своем проекте и выберите пункт New File…

 

Перед вами откроется окно добавления нового файла. В нем выберите Resource в разделе iOS, а в правой части — Property List.

 

После нажатия на кнопку Next укажите имя файла, к примеру array и нажмите на кнопку Save. Теперь в каталоге Supporting Files вы увидите новый файл с названием array.plist. Но пока что он пуст. В первую очередь нам следует указать какого типа данные будут храниться в этом файле. Я не нашел способа как это сделать в интерактивном режиме. Поэтому объясняю тот способ, который знаю я. Нажмите на array.plist правой кнопкой, выберите пункт Open As и со всплывающего подменю пункт Source Code.

 

 

Как я уже говорил, *.plist-файлы очень похожи на *.xml. А приведенная ниже картинка лишь доказывает это.

Наше внимание привлекает строчка обведенная красной линией. Если вместо слова dict мы напишем array то основной тип данных которые будут храниться в нашем файле станет массивом (вместо словаря).

Чтобы выйти с режима редактирования файла, снова нажмите на него правой кнопкой мыши, выберите пункт меню Open As и со всплывающего подменю пункт Property List.

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

 

Сразу после нажатия данного пункта меню в нашем файле появится новая запись.

Здесь мы можем указать тип данных, которые будем хранить, значения и в случае с библиотекой — ключ. Количество типо ограничено:

По умолчанию Xcode предложил нам строковый тип данных, не будем изменять его. Просто укажем любое значение в поле Value. Проделайте ту же операцию еще для нескольких записей. В результате вы должны получить *.plist-файл такого вида:

Файл с исходными данными готов, теперь перейдем к реализации метода его чтения. Откройте реализацию классаFileSystemiOSViewController, раскомментируйте и измените метод viewDidLoad:

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *defaultPath = [[NSBundle mainBundle] pathForResource:@"array.plist" ofType:nil];
    NSArray *array = [NSArray arrayWithContentsOfFile:defaultPath];
    NSLog(@"%@", array);
}</code>

 

В этом примере мы получаем путь к файлу array.plist, считываем данные с него в массив и выводим массив в консоль.

 

2011-09-07 17:24:18.734 FileSystemiOS[4983:b303] (

    «Val 1»,

    «Val 2»,

    «Val 3»

)
Как видите, в консоль вывелись те значения, которые мы ввели в наш файл. Чаще всего такого рода данные выводятся в таблицу. Это очень удобно, поскольку вы не храните большие объемы данных в коде, а выносите их как бы в отдельные хранилища. Теперь, если вам прийдется изменять значения исходных данных — вам нет необходимости изменять код программы. Данные будут всегда под рукой и на видном месте.

Теперь попробуем выполнить ту же операцию для словарей. Аналогичным образом создайте еще один *.plist-файл и назовите его dictionary.plist. Но основной тип данных не будем изменять (он и так по умолчанию типа NSDictionary).

Добавьте несколько записей в новый *.plist-файл, только теперь кроме типа данных и значения укажите ключи. После всех изменений файл dictionary.plist должен выглядеть так:

Снова изменим метод  viewDidLoad:

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *defaultPath = [[NSBundle mainBundle] pathForResource:@"array.plist" ofType:nil];
    NSArray *array = [NSArray arrayWithContentsOfFile:defaultPath];
    NSLog(@"%@", array);

    NSLog(@"---------------------------");

    NSString *defaultPathDic = [[NSBundle mainBundle] pathForResource:@"dictionary.plist" ofType:nil];
    NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:defaultPathDic];
    NSLog(@"Value for key1 = %@", [dictionary valueForKey:@"key1"]);
    NSLog(@"Value for key2 = %@", [dictionary valueForKey:@"key2"]);
    NSLog(@"Value for key3 = %@", [dictionary valueForKey:@"key3"]);
}</code>

Соответственно измениться и результат работы программы:

 

2011-09-07 17:24:18.734 FileSystemiOS[4983:b303] (

    «Val 1»,

    «Val 2»,

    «Val 3»

)

2011-09-07 17:24:18.736 FileSystemiOS[4983:b303] —————————

2011-09-07 17:24:18.737 FileSystemiOS[4983:b303] Value for key1 = Val 1

2011-09-07 17:24:18.738 FileSystemiOS[4983:b303] Value for key2 = Val 2

2011-09-07 17:24:18.738 FileSystemiOS[4983:b303] Value for key3 = Val 3
То есть мы с файла получили словарь (вместе с его ключами). И по указанному ранее ключу получаем значение. Таким способом удобно хранить исходные настройки программы.

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

Comments are closed.