Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Работа с данными
Разработка приложений для 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. Работа с данными
Nächste SlideShare
Wird geladen in …5
×

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

919 Aufrufe

Veröffentlicht am

Veröffentlicht in: Bildung
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Интуит. Разработка приложений для 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

×