Вандад Нахавандипур - iOS. Приемы программирования
- Название:iOS. Приемы программирования
- Автор:
- Жанр:
- Издательство:Питер
- Год:2014
- Город:Санкт-Петербург
- ISBN:978-5-496-01016-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Вандад Нахавандипур - iOS. Приемы программирования краткое содержание
Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.
Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.
iOS. Приемы программирования - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Программистам требуется использовать 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//tmp/
См. также
Раздел 12.0.
12.2. Запись информации в файлы и считывание информации из файлов
Постановка задачи
Требуется сохранить на диске информацию (например, текст, данные, изображения и т. д.).
Решение
Все классы Cocoa, обеспечивающие сохранение информации, например NSString, UIImage и NSData, предоставляют методы экземпляра, позволяющие сохранять данные на диске по заданному пути.
Обсуждение
Чтобы сохранять текст на диске (предполагается, что ваш текст сохранен в экземпляре NSString или неизменяемой версии этого класса), можно воспользоваться методом экземпляра writeToFile: atomically: encoding: error:, относящимся к этому классу. Этот метод применяется со строками, представляющими собой пути назначения. Вот его отдельные параметры.
• writeToFile — путь к файлу, в который нужно записать информацию, указывается в виде строки.
• atomically — логическое значение. Если оно установлено в YES, то файл сначала будет записываться во временное пространство, а потом перемещаться на тот адрес, где вы хотите его расположить. Так гарантируется, что содержимое файла, которое требуется сохранить, сначала будет просто перенесено на диск, а уже затем пересохранено в месте назначения. Поэтому, если вдруг отказ системы iOS произойдет прежде, чем файл будет сохранен в месте назначения, контент будет доступен и позднее, когда операционная система возобновит работу. И вы сможете сохранить информацию куда следует. При сохранении информации рекомендуется устанавливать данное значение в YES, чтобы ни при каких обстоятельствах не терять информацию работающего приложения безвозвратно.
• encoding — кодировка текста, который вы хотите сохранить по указанному адресу. Обычно в данном случае используется кодировка UTF-8, задаваемая с помощью константы NSUTF8StringEncoding.
• error — принимает указатель на объект NSError. Поэтому если операция сохранения завершится ошибкой и будет прервана, то вы сможете выяснить, какая именно ошибка произошла. Этому параметру можно передать значение nil, если вас не интересуют ошибки, которые могут возникнуть в процессе сохранения. Не забывайте, что эта функция возвращает логическое значение и вы можете воспользоваться им, чтобы просто определить, произошла какая-либо ошибка или нет.
Например, если у вас есть некий текст, который вы хотите сохранить в приложении, но резервно копировать его на уровне системы iOS не требуется, то можно поступить так:
NSString *someText = @"Random string that won't be backed up.";
NSString *destinationPath =
[NSTemporaryDirectory()
stringByAppendingPathComponent:@"MyFile.txt"];
NSError *error = nil;
BOOL succeeded = [someText writeToFile: destinationPath
atomically: YES
encoding: NSUTF8StringEncoding
error:&error];
if (succeeded) {
NSLog(@"Successfully stored the file at: %@", destinationPath);
} else {
NSLog(@"Failed to store the file. Error = %@", error);
}
Кроме того, когда сделаете все это, можете дополнительно убедиться, что вся работа выполнена верно. Попытайтесь считать ту же строку из файла назначения в память. Для этого используется метод класса stringWithContentsOfFile: encoding: error:, относящийся к классу NSString. В ответ вы должны получить автоматически высвобожденную строку, которая представляет собой содержимое указанного файла. Если вы хотите явно инстанцировать объект типа NSString с содержимым файла, просто примените метод экземпляра initWithContentsOfFile: encoding: error:, относящийся к классу NSString, вот так:
Читать дальшеИнтервал:
Закладка: