[NSPredicate predicateWithFormat:@"(age >= 100) AND (age <= 200)"];
request.resultType = NSManagedObjectIDResultType;
return request;
}
А вот как мы будем создавать фоновый контекст и выполнять в нем запрос на выборку данных:
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
__weak NSManagedObjectContext *mainContext = self.managedObjectContext;
__weak AppDelegate *weakSelf = self;
__block NSMutableArray *mutablePersons = nil;
/* Создаем фоновый контекст */
NSManagedObjectContext *backgroundContext =
[[NSManagedObjectContext alloc]
initWithConcurrencyType: NSPrivateQueueConcurrencyType];
backgroundContext.persistentStoreCoordinator =
self.persistentStoreCoordinator;
/* Выполняем блок в фоновом контексте */
[backgroundContext performBlock: ^{
NSError *error = nil;
NSArray *personIds = [backgroundContext
executeFetchRequest: [weakSelf newFetchRequest]
error:&error];
if (personIds!= nil && error == nil){
mutablePersons = [[NSMutableArray alloc]
initWithCapacity: personIds.count];
/* Теперь переходим в главный контекст и получаем эти объекты
в главном контексте, исходя из их ID */
dispatch_async(dispatch_get_main_queue(), ^{
for (NSManagedObjectID *personId in personIds){
Person *person = (Person *)[mainContext
objectWithID: personId];
[mutablePersons addObject: person];
}
[weakSelf processPersons: mutablePersons];
});
} else {
NSLog(@"Failed to execute the fetch request.");
}
}];
self.window = [[UIWindow alloc]
initWithFrame: [[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Этот код собирает все управляемые объекты в виде массива, а затем вызывает в делегате нашего приложения метод processPersons:, обрабатывающий результаты массива. Напишем этот метод следующим образом:
— (void) processPersons:(NSArray *)paramPersons{
for (Person *person in paramPersons){
NSLog(@"First name = %@, last name = %@, age = %ld",
person.firstName,
person.lastName,
(long)person.age.integerValue);
}
}
См. также
Разделы 7.4, 16.4 и 16.6.
16.10. Использование специальных типов данных в модели Core Data
Постановка задачи
Вы считаете, что набор типов данных, представленных в Core Data, не удовлетворяет стоящим перед вами требованиям. Вам хотелось бы использовать в объектах моделей и дополнительные типы данных, например UIColor. Но такие объекты не содержатся в Core Data в готовом виде.
Решение
Используйте преобразуемые типы данных.
Обсуждение
Core Data позволяет создавать для объектов моделей свойства, а потом присваивать этим свойствам типы данных. Выбор при этом довольно ограничен: Core Data допускает использование лишь таких типов данных, которые могут быть преобразованы в экземпляр NSData и обратно. Но существует целый ряд популярных классов, которые вы по умолчанию не можете использовать в таких свойствах. Что же делать? Применяйте