- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
iOS. Приемы программирования - Вандад Нахавандипур
Шрифт:
Интервал:
Закладка:
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[self createNewPersonWithFirstName:@"Anthony"
lastName:@"Robbins"
age:51];
[self createNewPersonWithFirstName:@"Richard"
lastName:@"Branson"
age:61];
/* Сначала создаем запрос выборки данных. */
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSError *requestError = nil;
/* Теперь применим запрос выборки данных к контексту. */
NSArray *persons =
[self.managedObjectContext executeFetchRequest: fetchRequest
error:&requestError];
/* Убеждаемся, что получили массив. */
if ([persons count] > 0){
/* Удаляем последний контакт из массива. */
Person *lastPerson = [persons lastObject];
[self.managedObjectContext deleteObject: lastPerson];
if ([lastPerson isDeleted]){
NSLog(@"Successfully deleted the last person…");
NSError *savingError = nil;
if ([self.managedObjectContext save:&savingError]){
NSLog(@"Successfully saved the context.");
} else {
NSLog(@"Failed to save the context.");
}
} else {
NSLog(@"Failed to delete the last person.");
}
} else {
NSLog(@"Could not find any Person entities in the context.");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
После запуска приложения в окне консоли отобразится примерно следующий результат:
Successfully deleted the last person… // последний контакт успешно удален
Successfully saved the context. // контекст успешно сохранен
16.6. Сортировка данных в Core Data
Постановка задачи
Требуется сортировать управляемые объекты (записи), выбираемые из контекста управляемых объектов (базы данных).
Решение
Нужно создать по экземпляру класса NSSortDescriptor для каждого атрибута (в терминологии баз данных — столбца) той сущности, в которой требуется произвести сортировку. Дескрипторы сортировки добавляются к массиву, а сам массив присваивается экземпляру NSFetchRequest с помощью метода экземпляра setSortDescriptors:. В данном коде, приведенном в качестве примера, Sorting_Data_in_Core_DataAppDelegate — это класс, представляющий делегат универсального приложения (о том, как создается сущность Person, рассказано в разделах 16.1 и 16.2:
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[self createNewPersonWithFirstName:@"Richard"
lastName:@"Branson"
age:61];
[self createNewPersonWithFirstName:@"Anthony"
lastName:@"Robbins"
age:51];
/* Сначала создаем запрос выборки данных. */
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]
initWithEntityName:@"Person"];
NSSortDescriptor *ageSort =
[[NSSortDescriptor alloc] initWithKey:@"age"
ascending: YES];
NSSortDescriptor *firstNameSort =
[[NSSortDescriptor alloc] initWithKey:@"firstName"
ascending: YES];
fetchRequest.sortDescriptors = sortDescriptors;
/* Сообщаем запросу, что сначала мы хотим
считать содержимое сущности Person. */
[fetchRequest setEntity: entity];
NSError *requestError = nil;
/* Теперь применим запрос выборки данных к контексту. */
NSArray *persons =
[self.managedObjectContext executeFetchRequest: fetchRequest
error:&requestError];
for (Person *person in persons){
NSLog(@"First Name = %@", person.firstName);
NSLog(@"Last Name = %@", person.lastName);
NSLog(@"Age = %lu", (unsigned long)[person.age unsignedIntegerValue]);
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Обсуждение
Экземпляр класса NSFetchRequest может нести с собой массив экземпляров NSSortDescriptor. Каждый дескриптор сортировки определяет атрибут (столбец) актуальной сущности, в которой необходимо произвести сортировку. Кроме того, он указывает порядок сортировки — восходящий или нисходящий. Например, сущность Person, которую мы создали в разделе 16.1, имеет атрибуты firstName, lastName и age. Если мы хотим считать все контакты в контексте управляемых объектов и отсортировать этих людей по возрасту, от самого младшего до самого старшего, то создадим экземпляр NSSortDescriptor с ключом age и зададим для него восходящий порядок (ascending):
NSSortDescriptor *ageSortDescriptor =
[[NSSortDescriptor alloc] initWithKey:@"age"
ascending: YES];
Запросу выборки данных можно присвоить более одного дескриптора сортировки. Порядок расположения данных в массиве определяет и порядок, в котором задаются дескрипторы. Иными словами, вывод сортируется по первому дескриптору в массиве, в полученном множестве записи сортируются по второму дескриптору в массиве и т. д.
См. также
Раздел 16.4.
16.7. Оптимизация доступа к данным в табличных видах
Постановка задачи
Имеется приложение, в котором пользователь просматривает управляемые объекты в табличных видах. В этом приложении вы хотите выбирать и представлять данные более гибким и естественным образом, не управляя ими при этом вручную.
Решение
Воспользуйтесь контроллерами для представления результатов выборки, которые являются экземплярами класса NSFetchedResultsController.
В этом разделе для ускорения разработки рассматриваемого приложения будут применены раскадровки. Подробнее о раскадровках рассказано в главе 6.
Обсуждение
Контроллер для представления результатов выборки (Fetched Result Controller) функционально аналогичен табличному виду. Как и в таблице, в нем есть разделы и строки. Контроллер для представления результатов выборки может считывать управляемые объекты из соответствующего контекста, а также подразделять эти объекты на разделы и строки. Каждый раздел является группой, если задать такое условие в параметрах запроса, а каждая строка в разделе является управляемым объектом. Есть несколько важных причин, по которым может понадобиться модифицировать ваше приложение, чтобы в нем можно было применять контроллеры для представления результатов выборки. Эти причины таковы.
• После создания контроллера для представления результатов выборки в контексте управляемых объектов любое изменение данных (вставка, удаление, модификация и т. д.) немедленно отразится и в контроллере для представления результатов выборки. Например, можно создать контроллер для представления результатов выборки, чтобы считывать управляемые объекты сущности Person. Потом где-то в другой точке вашего приложения может понадобиться вставить в контекст новый управляемый объект Person (речь идет о том самом контексте, в котором был создан контроллер для представления результатов выборки). Сразу же после этого новый управляемый объект станет доступен в контроллере для представления результатов выборки. Чудеса, да и только!
• Имея контроллер для представления результатов выборки, можно более эффективно управлять кэшем. Например, можно указать контроллеру для представления результатов выборки сохранить в памяти только N управляемых объектов на каждый экземпляр такого контроллера.
• Контроллеры для представления результатов выборки аналогичны табличным видам в том отношении, что в них, как и в таблицах, есть разделы и строки — об этом говорилось ранее. Можно использовать контроллер для представления результатов выборки, чтобы без труда отображать табличные виды вашего приложения прямо в графическом пользовательском интерфейсе.
Рассмотрим некоторые важные свойства и методы экземпляра, относящиеся к контроллерам для представления результатов выборки (все объекты относятся к типу NSFetchedResultsController).
• sections (свойство типа NSArray) — контроллер для представления результатов выборки может группировать данные, используя путь к ключу. Выделенный инициализатор класса NSFetchedResultsController принимает данный группирующий фильтр в параметре sectionNameKeyPath. После этого в массиве sections будут содержаться все сгруппированные разделы. Каждый объект данного массива соответствует протоколу NSFetchedResultsSectionInfo.
• objectAtIndexPath: (метод экземпляра, возвращает управляемый объект) — объекты, выбираемые с помощью описываемого контроллера, их можно получать по индексу в разделе или строке. Строки каждого раздела нумеруются от 0 до N — 1, где N — общее количество элементов в данном разделе. В объекте пути к индексу указывается как индекс раздела, так и индекс строки, и в результате этого совершенно точно формулируется информация, необходимая для получения конкретных объектов от контроллера для представления результатов выборки. Метод экземпляра objectAtIndexPath принимает индексные пути. Каждый индексный путь — это объект типа NSIndexPath. Если требуется создать ячейку табличного вида, воспользовавшись управляемым объектом из контроллера для представления результатов выборки, то нужно просто передать объект индексного пути методу делегата табличного вида tableView: cellForRowAtIndexPath:. Такая передача происходит в параметре cellForRowAtIndexPath этого метода. Если вы хотите сами создать индексный путь в любой другой точке вашего приложения, пользуйтесь методом класса indexPathForRow: inSection:, относящимся к классу NSIndexPath.

