Чтение онлайн

ЖАНРЫ

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

• Library/Application Support/ — данные, создаваемые вашим приложением (за исключением тех данных, которые создает сам пользователь), должны храниться в этом каталоге. Приятно отметить, что iOS выполняет резервное копирование данного каталога. Возможно, этот каталог не будет создаваться автоматически и вам придется создавать его самостоятельно, если его не существует. О создании этого каталога мы поговорим позже в данной главе.

• tmp/ — это временные файлы, которые ваше приложение может скачивать, создавать и т. д. iOS не выполняет резервного копирования данного каталога. Например, вы можете скачать из Интернета несколько фотографий и сохранить их в каталоге, чтобы повысить производительность вашего приложения, ведь

в таком случае эти фотографии не придется скачивать заново при каждом запуске приложения. Каталог служит именно для этой цели. Убедитесь, что в нем не будут храниться документы или файлы, создаваемые пользователем.

Итак, теперь вы знаете, какие каталоги автоматически создаются операционной системой при установке приложения на устройстве с iOS. Далее найдем пути к остальным полезным каталогам, которые мы здесь уже упоминали. Воспользуемся теми API, которые Apple предоставляет специально для этих целей (о таких API пойдет речь в дальнейшем в этой главе).

12.1. Определение пути к самым полезным каталогам на диске

Постановка задачи

Требуется определить путь к некоторым наиболее полезным каталогам, доступ к которым есть у вашего приложения (например, к каталогам, рассмотренным во введении). Мы должны знать эти пути, чтобы иметь возможность обращаться к каталогам или создавать в них новое содержимое.

Программистам требуется использовать API, предоставляемые в iOS SDK, для нахождения путей к каталогам и/или файлам. Иными словами, путь к файлу или каталогу никогда не следует угадывать. Если, например, вы ищете пути, один из которых ведет к каталогу Documents (Документы), то нужно гарантировать, что для этого применяются правильные API. Никогда, ни в коем случае не рассчитывайте на то, что этот каталог будет называться в пакете вашего приложения именно Documents и никак иначе. Для нахождения пути к этому каталогу достаточно воспользоваться подходящими API. Если вас интересует не сам каталог, а отдельные содержащиеся в нем файлы, добавьте к концу обнаруженного пути имена тех или иных файлов.

Решение

Используйте метод экземпляра URLsForDirectory: inDomains:, относящийся к классу NSFileManager.

Обсуждение

Класс NSFileManager обеспечивает множество операций, связанных с файлами и каталогами, выполняемых в iOS. Все такие операции осуществляются прямо внутри ваших приложений, от вас требуется всего лишь создать экземпляр этого класса. Не рекомендую пользоваться разделяемым файловым менеджером, который предоставляется этим классом с помощью метода класса defaultManager, поскольку этот менеджер не является потокобезопасным. Лучше самостоятельно создать экземпляр класса NSFileManager и управлять им.

Метод экземпляра URLsForDirectory: inDomains:, относящийся к классу NSFileManager, позволяет искать конкретные каталоги в файловой системе iOS, в основном в песочнице вашего приложения. Этот метод имеет два параметра:

• URLsForDirectory: — это каталог, который вы хотите найти. Передайте этому параметру значение типа NSSearchPathDirectory (оно является перечислением). Далее поговорим о нем подробнее;

• inDomains — параметр указывает, где вы собираетесь искать конкретный каталог. Значение этого параметра должно относиться к типу NSSearchPathDomainMask (это тоже перечисление).

Предположим, вы хотите найти путь к каталогу Documents (Документы) вашего приложения. Вот как просто это делается:

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSArray *urls = [fileManager URLsForDirectory: NSDocumentDirectory

inDomains: NSUserDomainMask];

if ([urls count] > 0){

NSURL *documentsFolder = urls[0];

NSLog(@"%@", documentsFolder);

} else {

NSLog(@"Could not find the Documents folder.");

}

Как

видите, создав собственный экземпляр NSFileManager, мы передали значение NSDocumentDirectory в качестве искомого каталога и NSUserDomainMask — в качестве области поиска. Рассмотрим некоторые наиболее важные значения, которые можно передать каждому из параметров метода экземпляра URLsForDirectory: inDomains:, относящегося к классу NSFileManager:

• URLsForDirectory;

• NSLibraryDirectory — библиотечный каталог приложения;

• NSCachesDirectory — каталог кэша — о нем рассказано ранее;

• NSDocumentDirectory — каталог документов;

• inDomains;

• NSUserDomainMask.

Данное значение указывает, что поиск должен выполняться в актуальном пользовательском каталоге. В системе OS X этот каталог обозначался бы ~/.

С помощью этого метода мы можем найти и другие каталоги, например caches, как показано далее:

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSArray *urls = [fileManager URLsForDirectory: NSCachesDirectory

inDomains: NSUserDomainMask];

if ([urls count] > 0){

NSURL *cachesFolder = urls[0];

NSLog(@"%@", cachesFolder);

} else {

NSLog(@"Could not find the Caches folder.");

}

Если вы хотите найти каталог tmp, воспользуйтесь функцией NSTemporaryDirectory на языке C, вот так:

NSString *tempDirectory = NSTemporaryDirectory;

NSLog(@"Temp Directory = %@", tempDirectory);

Выполнив эту команду на устройстве, получим примерно следующий вывод:

Temp Directory = /private/var/mobile/

Applications/<# Здесь находится ID вашего приложения #>/tmp/

См. также

Раздел 12.0.

12.2. Запись информации в файлы и считывание информации из файлов

Постановка задачи

Требуется сохранить на диске информацию (например, текст, данные, изображения и т. д.).

Решение

Все классы Cocoa, обеспечивающие сохранение информации, например NSString, UIImage и NSData, предоставляют методы экземпляра, позволяющие сохранять данные на диске по заданному пути.

Обсуждение

Чтобы сохранять текст на диске (предполагается, что ваш текст сохранен в экземпляре NSString или неизменяемой версии этого класса), можно воспользоваться методом экземпляра writeToFile: atomically: encoding: error:, относящимся к этому классу. Этот метод применяется со строками, представляющими собой пути назначения. Вот его отдельные параметры.

Поделиться с друзьями: