Читаем iOS. Приемы программирования полностью

[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 и обратно. Но существует целый ряд популярных классов, которые вы по умолчанию не можете использовать в таких свойствах. Что же делать? Применяйте преобразуемые свойства. Сначала поясню, что это такое.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже