Работа с данными
Разработка приложений для iOS
Лекция 8
Глеб Тарасов
gleb34@gmail.com
Вспомним прошлое
занятие
Что нужно сделать, чтобы
загрузить данные в фоновом
потоке, а потом обновить
интерфейс?
dispatch_async(dispatch_get_global...
Как проще всего подключать
сторонние библиотеки к нашему
проекту?
через CocoaPods
Как называется самая популярная
библиотека для отправки GET и
POST запросов?
AFNetworking
Какой самый простой способ
загрузить текстовый файл по ссылке?
NSURL *url = [NSURL URLWithString:@"http://server.com/file....
Работа с файлами
https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverv...
<Application_Home>/AppName.app
readonly!
Бандл приложения
<Application_Home>/Documents/
read/write!
Критичные данные, которые мы не можем!
перегенерировать программно, чаще всего т...
<Application_Home>/tmp/
read/write!
Временные файлы, которые очищаются !
после перезапуска программы
<Application_Home>/Library/
read/write!
Важные файлы, которые нужны программе, !
но создал не пользователь.
<Application_Home>/Library/Application Support
read/write!
лучше хранить все тут, а не в Library
<Application_Home>/Library/Caches
read/write!
храним тут данные, которые можно потом
перегенерировать или перезагрузить
com.apple.MobileBackup
Атрибут файла, который предотвращает backup файла в
iCloud и iTunes
https://developer.apple.com/lib...
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *path = paths[0...
NSString *path = NSTemporaryDirectory();
NSLog(@"%@", path);
Путь к папке tmp
NSString *path = NSTemporaryDirectory();
NSString *folderPath = [path stringByAppendingPathComponent:@"folder"];
NSString ...
NSFileManager
NSFileManager *m = [NSFileManager defaultManager];
[m removeItemAtPath:path error:nil];
[m removeItemAtURL:u...
Сохранение в файл
NSString *path = ...
NSString *filePath = [path stringByAppendingPathComponent:@"file.txt"];
!
NSString ...
Чтение из файла
NSString *str = [[NSString alloc] initWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
!
...
NSUserDefaults
NSUserDefaults *d = [NSUserDefaults standardUserDefaults];
!
[d setObject:@"qwerty" forKey:@"key"];
[d setI...
NSCoding
@interface User : NSObject<NSCoding>
!
@property (strong, nonatomic) NSString *firstName;
@property (strong, nona...
@implementation User
!
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.firstName forKey:@"firstName"...
NSUserDefaults *d = [NSUserDefaults standardUserDefaults];
!
User *u = ...
NSData *data1 = [NSKeyedArchiver archivedDataWi...
NSUserDefaults *d = [NSUserDefaults standardUserDefaults];
!
NSData *data1 = [d objectForKey:@"data1"];
User *u = [NSKeyed...
sqlite
Core Data
- (NSManagedObjectModel *)createManagedObjectModel
{
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Test" withE...
- (NSPersistentStoreCoordinator *)loadPersistentStoreCoordinator
{
NSString *docs = NSSearchPathForDirectoriesInDomains(NS...
- (NSManagedObjectContext *)loadManagedObjectContext
{
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCo...
Вставка объектов
NSManagedObjectContext *m = [self managedObjectContext];
NSManagedObject *city = [NSEntityDescription ins...
Загрузка объектов
NSFetchRequest *request = [[NSFetchRequest alloc]
initWithEntityName:@"User"];
!
NSSortDescriptor *sort ...
NSPredicate
Базовые cравнения
• =, == (age == 13)
• >=, => (age >= 13)
• <=, =< (age <= 13)
• > (age > 13)
• < (age < 13)
...
Базовые булевы операции
• AND, && (age > 13 && age < 27)
• OR, || (age > 13 || name != nil)
• NOT, ! (!(age > 13))
Строковые сравнения
[cd] - case insensitive и diacritic insensitive
•BEGINSWITH (name BEGINSWITH[c] 'алекс')
•CONTAINS (na...
Функции агрегирования
•ANY, SOME (ANY children.age < 18)
•ALL (ALL children.age < 18)
•NONE (NONE children.age < 18)
•IN: ...
Удаление объектов
for (NSManagedObject *user in users)
{
[[user managedObjectContext] deleteObject:user];
}
Многопоточность 	

в Core Data
• каждый контекст привязан к одному
потоку	

• каждая сущность привязана к одному
контексту...
Демонстрация
• создание модели данных	

• создание собственных классов для
сущностей	

• миграция версий
Домашнее задание
• добавить работу с файлами и базой
данных
Всё!
Глеб Тарасов	

gleb34@gmail.com	

twitter.com/pilot34
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Upcoming SlideShare
Loading in …5
×

Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными

848 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
848
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными

  1. 1. Работа с данными Разработка приложений для iOS Лекция 8 Глеб Тарасов gleb34@gmail.com
  2. 2. Вспомним прошлое занятие
  3. 3. Что нужно сделать, чтобы загрузить данные в фоновом потоке, а потом обновить интерфейс? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // background dispatch_async(dispatch_get_main_queue(), ^{ // main }); });
  4. 4. Как проще всего подключать сторонние библиотеки к нашему проекту? через CocoaPods
  5. 5. Как называется самая популярная библиотека для отправки GET и POST запросов? AFNetworking
  6. 6. Какой самый простой способ загрузить текстовый файл по ссылке? NSURL *url = [NSURL URLWithString:@"http://server.com/file.txt"]; NSString *str = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
  7. 7. Работа с файлами
  8. 8. https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html
  9. 9. <Application_Home>/AppName.app readonly! Бандл приложения
  10. 10. <Application_Home>/Documents/ read/write! Критичные данные, которые мы не можем! перегенерировать программно, чаще всего те,! которые создал сам пользователь
  11. 11. <Application_Home>/tmp/ read/write! Временные файлы, которые очищаются ! после перезапуска программы
  12. 12. <Application_Home>/Library/ read/write! Важные файлы, которые нужны программе, ! но создал не пользователь.
  13. 13. <Application_Home>/Library/Application Support read/write! лучше хранить все тут, а не в Library
  14. 14. <Application_Home>/Library/Caches read/write! храним тут данные, которые можно потом перегенерировать или перезагрузить
  15. 15. com.apple.MobileBackup Атрибут файла, который предотвращает backup файла в iCloud и iTunes https://developer.apple.com/library/ios/qa/qa1719/_index.html - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); NSError *error = nil; BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey error: &error]; if(!success){ NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); } return success; }
  16. 16. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = paths[0]; NSLog(@"%@", path); Получения пути к папке NSDocumentDirectory NSCachesDirectory NSLibraryDirectory NSApplicationSupportDirectory
  17. 17. NSString *path = NSTemporaryDirectory(); NSLog(@"%@", path); Путь к папке tmp
  18. 18. NSString *path = NSTemporaryDirectory(); NSString *folderPath = [path stringByAppendingPathComponent:@"folder"]; NSString *filePath = [folderPath stringByAppendingPathComponent:@"file.txt"]; ! NSString *folderPath2 = [filePath stringByDeletingLastPathComponent]; NSString *path2 = [folderPath2 stringByDeletingLastPathComponent]; Работа с путями NSURL *url = [NSURL fileURLWithPath:path]; NSLog(@"%@", url.path);
  19. 19. NSFileManager NSFileManager *m = [NSFileManager defaultManager]; [m removeItemAtPath:path error:nil]; [m removeItemAtURL:url error:nil]; [m copyItemAtPath:pathFrom toPath:pathTo error:nil]; [m copyItemAtURL:urlFrom toURL:urlTo error:nil]; [m moveItemAtPath:pathFrom toPath:pathTo error:nil]; [m moveItemAtURL:urlFrom toURL:urlTo error:nil]; [m createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
  20. 20. Сохранение в файл NSString *path = ... NSString *filePath = [path stringByAppendingPathComponent:@"file.txt"]; ! NSString *str = @"test"; [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSData *data = ... [data writeToFile:path atomically:YES];
  21. 21. Чтение из файла NSString *str = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; ! ! ! ! NSData *data = [[NSData alloc] initWithContentsOfFile:path];
  22. 22. NSUserDefaults NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; ! [d setObject:@"qwerty" forKey:@"key"]; [d setInteger:123 forKey:@"key2"]; [d setObject:@[ @"123", @(12), @"321" ] forKey:@"key3"]; [d synchronize]; ! NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; NSString *str = [d objectForKey:@"key"]; NSInteger num = [d integerForKey:@"key2"]; NSArray *arr = [d objectForKey:@"key3"];
  23. 23. NSCoding @interface User : NSObject<NSCoding> ! @property (strong, nonatomic) NSString *firstName; @property (strong, nonatomic) NSString *lastName; @property (nonatomic) NSInteger age; ! @end
  24. 24. @implementation User ! - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.firstName forKey:@"firstName"]; [aCoder encodeObject:self.lastName forKey:@"lastName"]; [aCoder encodeInteger:self.age forKey:@"age"]; } ! - (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if (self) { self.firstName = [aDecoder decodeObjectForKey:@"firstName"]; self.lastName = [aDecoder decodeObjectForKey:@"lastName"]; self.age = [aDecoder decodeIntegerForKey:@"age"]; } return self; } ! @end
  25. 25. NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; ! User *u = ... NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:u]; NSArray *arr = @[ user1, user2, user3 ]; NSData *data2 = [NSKeyedArchiver archivedDataWithRootObject:arr]; [d setObject:data1 forKey:@"data1"]; [d setObject:data2 forKey:@"data2"]; Сохранение произвольных объектов
  26. 26. NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; ! NSData *data1 = [d objectForKey:@"data1"]; User *u = [NSKeyedUnarchiver unarchiveObjectWithData:data1]; NSData *data2 = [d objectForKey:@"data2"]; NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data2]; Считывание произвольных объектов
  27. 27. sqlite
  28. 28. Core Data
  29. 29. - (NSManagedObjectModel *)createManagedObjectModel { NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Test" withExtension:@"momd"]; NSManagedObjectModel *m = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return m; } NSManagedObjectModel (аналог схемы базы данных)
  30. 30. - (NSPersistentStoreCoordinator *)loadPersistentStoreCoordinator { NSString *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *filePath = [docs stringByAppendingPathComponent:@"db.sqlite"]; NSURL *storeURL = [NSURL fileURLWithPath:filePath]; ! NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption : @YES }; NSPersistentStoreCoordinator *p = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![p addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:nil]) { NSLog(@"error"); } return p; } NSPersistentStoreCoordinator (информация о типе БД и месте хранения данных)
  31. 31. - (NSManagedObjectContext *)loadManagedObjectContext { NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; NSManagedObjectContext *c = [[NSManagedObjectContext alloc] init]; [c setPersistentStoreCoordinator:coordinator]; return c; } NSManagedObjectContext (аналог соединения с базой данных)
  32. 32. Вставка объектов NSManagedObjectContext *m = [self managedObjectContext]; NSManagedObject *city = [NSEntityDescription insertNewObjectForEntityForName:@"City" inManagedObjectContext:m]; [city setValue:@"Москва" forKey:@"name"]; [m save:nil];
  33. 33. Загрузка объектов NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"User"]; ! NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; ! NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 12"]; ! request.predicate = predicate; request.sortDescriptors = @[ sort ]; ! NSArray *users = [[self managedObjectContext] executeFetchRequest:request error:nil]; for (NSManagedObject *user in users) { NSLog(@"%@", [user valueForKey:@"name"]); }
  34. 34. NSPredicate Базовые cравнения • =, == (age == 13) • >=, => (age >= 13) • <=, =< (age <= 13) • > (age > 13) • < (age < 13) • !=, <> (age != 13) • BETWEEN (age BETWEEN { 0 , 33 }) http://nshipster.com/nspredicate/
  35. 35. Базовые булевы операции • AND, && (age > 13 && age < 27) • OR, || (age > 13 || name != nil) • NOT, ! (!(age > 13))
  36. 36. Строковые сравнения [cd] - case insensitive и diacritic insensitive •BEGINSWITH (name BEGINSWITH[c] 'алекс') •CONTAINS (name CONTAINS[cd] 'алекс') •ENDSWITH (name ENDSWITH 'андр') •LIKE: (name LIKE 'Але*нд?') •MATCHES (name MATCHES 'Александр+')
  37. 37. Функции агрегирования •ANY, SOME (ANY children.age < 18) •ALL (ALL children.age < 18) •NONE (NONE children.age < 18) •IN: (name IN { 'Ben', 'Melissa', 'Nick' })
  38. 38. Удаление объектов for (NSManagedObject *user in users) { [[user managedObjectContext] deleteObject:user]; }
  39. 39. Многопоточность в Core Data • каждый контекст привязан к одному потоку • каждая сущность привязана к одному контексту • удобная многопоточная работа: библиотека MagicalRecord
  40. 40. Демонстрация • создание модели данных • создание собственных классов для сущностей • миграция версий
  41. 41. Домашнее задание • добавить работу с файлами и базой данных
  42. 42. Всё! Глеб Тарасов gleb34@gmail.com twitter.com/pilot34

×