Рейтинговые книги
Читем онлайн iOS. Приемы программирования - Вандад Нахавандипур

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 103 104 105 106 107 108 109 110 111 ... 165

• 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:, относящимся к этому классу. Этот метод применяется со строками, представляющими собой пути назначения. Вот его отдельные параметры.

• 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, вот так:

— (BOOL) writeText:(NSString *)paramText toPath:(NSString *)paramPath{

return [paramText writeToFile: paramPath

atomically: YES

encoding: NSUTF8StringEncoding

error: nil];

}

— (NSString *) readTextFromPath:(NSString *)paramPath{

return [[NSString alloc] initWithContentsOfFile: paramPath

encoding: NSUTF8StringEncoding

error: nil];

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSString *filePath = [NSTemporaryDirectory()

stringByAppendingPathComponent:@"MyFile.txt"];

if ([self writeText:@"Hello, World!" toPath: filePath]){

NSString *readText = [self readTextFromPath: filePath];

if ([readText length] > 0){

NSLog(@"Text read from disk = %@", readText);

} else {

NSLog(@"Failed to read the text from disk.");

}

} else {

NSLog(@"Failed to write the file.");

}

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

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

Если вы хотите работать с URL, инкапсулированными в экземпляры NSURL (или в экземпляры изменяемой версии этого класса), используйте в данном случае метод экземпляра writeToURL: atomically: encoding: error:.

Экземпляры NSURL могут указывать на ресурсы (файлы, каталоги и т. д.), расположенные в локальной системе или на удаленных устройствах. Так, экземпляр NSURL может представлять локальный файл в каталоге Documents (Документы) в вашем приложении, а другой NSURL — соответствовать URL сайта www.apple.com. Этот класс просто предоставляет вам функции, необходимые для доступа к URL и для работы с ними, независимо от типа конкретного URL.

Другие основополагающие классы обладают примерно такими же методами, как и NSString. Возьмем, к примеру, NSArray. Чтобы сохранить содержимое массива, пользуйтесь методом экземпляра writeToFile: atomically:, относящимся к классу NSArray. Чтобы считать с диска содержимое любого массива, можно просто выделить экземпляр массива, а потом инициализировать его с помощью initWithContentsOfFile: — это метод-инициализатор для работы с массивами. Вот примеры использования обоих методов:

NSString *filePath = [NSTemporaryDirectory()

stringByAppendingPathComponent:@"MyFile.txt"];

NSArray *arrayOfNames = @[@"Steve", @"John", @"Edward"];

if ([arrayOfNames writeToFile: filePath atomically: YES]){

NSArray *readArray = [[NSArray alloc] initWithContentsOfFile: filePath];

if ([readArray count] == [arrayOfNames count]){

NSLog(@"Read the array back from disk just fine.");

} else {

NSLog(@"Failed to read the array back from disk.");

}

} else {

NSLog(@"Failed to save the array to disk.");

}

Метод экземпляра writeToFile: atomically:, относящийся к классу NSArray, может сохранять лишь массивы, содержащие объекты следующих типов:

1 ... 103 104 105 106 107 108 109 110 111 ... 165
На этой странице вы можете бесплатно читать книгу iOS. Приемы программирования - Вандад Нахавандипур бесплатно.
Похожие на iOS. Приемы программирования - Вандад Нахавандипур книги

Оставить комментарий