Я создаю и добавляю несколько управляемых объектов в Core Data из фоновой очереди. Насколько я понял, я не мог получить доступ к контексту из фонового потока, поэтому я использовал PerformBlock, чтобы запланировать добавление к Core Data обратно в ту же очередь, в которой был создан контекст. Это прекрасно работает...
Мой вопрос: во время тестирования я заметил, что после удаления [moc performBlock:^{ ... }];
приложение по-прежнему работает так, как ожидалось (возможно, даже на доли секунды быстрее). Нужен ли мне performBlock
? Я бы предположил, что да, и он просто работает (на данный момент :) не в потокобезопасном режиме, я просто хотел проверить, чтобы убедиться, что мое понимание не ошибочно.
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(backgroundQueue, ^{
// GET DATA
// PROCESS DATA
NSManagedObjectContext *context = [[self managedDocument] managedObjectContext];
[moc performBlock:^{
// ADD TO CORE DATA
[Core createRodInContext:context withDictionary:fuelRodDictionary];
}];
});
EDIT: добавлена реализация для createRodInContext...
+ (Rod *)createRodInContext:(NSManagedObjectContext *)context withDictionary:(NSDictionary *)dictionary {
// CREATE
Rod *rod = [NSEntityDescription insertNewObjectForEntityForName:@"Rod" inManagedObjectContext:context];
// POPULATE
[neo setDataCode:[dictionary objectForKey:@"dataCode"]];
[neo setDataName:[dictionary objectForKey:@"dataName"]];
[neo setDataReference:[dictionary objectForKey:@"dataReference"]];
...
return rod;
}
createRodInContext:
. В этом методе лежит ключ к тому, почему он работает или не работает. - person jackslash   schedule 25.11.2012