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

на главную

Жанры

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

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

Шрифт:

Например, если у вас есть некий текст, который вы хотите сохранить в приложении, но резервно копировать его на уровне системы 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, может сохранять лишь массивы, содержащие объекты следующих типов:

• NSString;

• NSDictionary;

• NSArray;

• NSData;

• NSNumber;

• NSDate.

Если вы попытаетесь вставить в массив какие-либо другие объекты, то ваши данные не будут сохранены на диске, поскольку этот метод первым делом проверяет, относятся ли все объекты в составе массива к одному из вышеупомянутых типов. Это делается по той простой причине, что в противном случае среда времени исполнения Objective-C просто не разберется, как сохранять данные на диске. Предположим, мы инстанцируем класс под названием Person, создаем для этого класса два свойства, одно из которых соответствует имени, другое — фамилии. Затем инстанцируем экземпляр этого класса и добавим его к массиву. Как же массив сможет сохранить эту информацию о персоне на диск? Никак, поскольку система не будет знать, что именно требуется сохранять. Эта проблема называется «маршалинг». В операционной системе iOS она решена только для перечисленных типов.

Словари также очень похожи на массивы. Сохранение их данных на диске и считывание информации из словаря происходит практически так же, как и в случае с массивами. Имена методов такие же, как и в предыдущем примере, правила сохранения словарей не отличаются от правил сохранения массивов. Вот пример:

NSString *filePath = [NSTemporaryDirectory

stringByAppendingPathComponent:@"MyFile.txt"];

NSDictionary *dict = @{

Поделиться:
Популярные книги

Наследник и новый Новосиб

Тарс Элиан
7. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник и новый Новосиб

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Идеальный мир для Социопата 2

Сапфир Олег
2. Социопат
Фантастика:
боевая фантастика
рпг
6.11
рейтинг книги
Идеальный мир для Социопата 2

Краш-тест для майора

Рам Янка
3. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
эро литература
6.25
рейтинг книги
Краш-тест для майора

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие