Вандад Нахавандипур - iOS. Приемы программирования
- Название:iOS. Приемы программирования
- Автор:
- Жанр:
- Издательство:Питер
- Год:2014
- Город:Санкт-Петербург
- ISBN:978-5-496-01016-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Вандад Нахавандипур - iOS. Приемы программирования краткое содержание
Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.
Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.
iOS. Приемы программирования - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
— (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 = @{
@"first name": @"Steven",
@"middle name": @"Paul",
@"last name": @"Jobs",
};
if ([dict writeToFile: filePath atomically: YES]){
NSDictionary *readDictionary = [[NSDictionary alloc]
initWithContentsOfFile: filePath];
/* Теперь сравним словари и проверим, является ли словарь, считываемый
нами с диска, тем самым, который мы сохранили на диске */
if ([readDictionary isEqualToDictionary: dict]){
NSLog(@"The file we read is the same one as the one we saved.");
} else {
NSLog(@"Failed to read the dictionary from disk.");
}
} else {
NSLog(@"Failed to write the dictionary to disk.");
}
Как видите, в этом примере словарь записывается на диск, после чего считывается из этого самого места. После считывания мы сравниваем реальный словарь с тем, который сохранили на диске. Так мы должны убедиться, что оба словаря содержат одни и те же данные.
До сих пор мы применяли для сохранения содержимого на диске высокоуровневые классы, например NSString и NSArray. А что, если потребуется сохранить необработанный массив байтов? Это тоже делается просто. Предположим, у нас есть массив из четырех символов и его требуется сохранить на диск:
char bytes[4] = {'a', 'b', 'c', 'd'};
Чтобы сохранить этот необработанный массив байтов на диске простейшим способом, достаточно инкапсулировать его в другой высокоуровневой структуре данных, например NSData, а потом пользоваться соответствующими методами NSData для считывания данных с диска и записи их на диск. Методы сохранения и загрузки данных, применяемые в классе NSData, практически идентичны соответствующим методам классов NSArray и NSDictionary. Вот пример сохранения необработанных данных на диске и считывания их с диска:
NSString *filePath = [NSTemporaryDirectory()
stringByAppendingPathComponent:@"MyFile.txt"];
char bytes[4] = {'a', 'b', 'c', 'd'};
NSData *dataFromBytes = [[NSData alloc] initWithBytes: bytes
length: sizeof(bytes)];
if ([dataFromBytes writeToFile: filePath atomically: YES]){
NSData *readData = [[NSData alloc] initWithContentsOfFile: filePath];
if ([readData isEqualToData: dataFromBytes]){
NSLog(@"The data read is the same data as was written to disk.");
} else {
NSLog(@"Failed to read the data from disk.");
}
} else {
NSLog(@"Failed to save the data to disk.");
}
См. также
Раздел 12.0.
12.3. Создание каталогов на диске
Постановка задачи
Требуется возможность создавать на диске каталоги и сохранять в них определенные файлы из вашего приложения.
Решение
Пользуйтесь методом экземпляра createDirectoryAtPath: withIntermediateDirectories: attributes: error:, относящимся к классу NSFileManager, как показано далее:
— (BOOL) application:(UIApplication *)application
Интервал:
Закладка: