Comments 13
Для тех, кто хочет воспользоваться готовым решением, есть MagicalRecord.
Неистово плюсую. Одна строка на всю инициализацию стека — это круто. Сохранение данных выховом одного метода с параметром-блоком — ещё круче. Импорт данных из JSON тоже удачно дополняет общую картину. Многопоточность разруливается очень хорошо.
Забыл отметить, спасибо, добавил.
Если элементов настолько много, что начинает тормозить UI на удалении, то проще на выходе уходить в другой поток, брать с него контекст, фетчить ненужные объекты и удалять их.
Можно не сохранять контекст например.
Вот ещё очень удобная обёртка для Core Data: NLCoreData. Не тяжёлая, по сути тот же Core Data + категории + многопоточность.
Я только начинаю работать с CoreData и возник такой вопрос по статье: Если я делаю запрос из CoreData, то его следует делать только через daddyManagedObjectContext?
Пример:
NSArray *result = [daddyManagedObjectContext executeFetchRequest:request
error:&error];
Пример:
NSArray *result = [daddyManagedObjectContext executeFetchRequest:request
error:&error];
Не нужно обращаться к какому-то конкретному контексту внутри CoreDataManager, пользователь этого мини-фреймворка должен сам решить какой контекст для запроса ему использовать.
Можно написать в CoreDataManager небольшой хэлпер:
И метод для фетча:
Тогда вызов из любого участка кода будет сводиться к следующему:
Можно написать в CoreDataManager небольшой хэлпер:
- (NSManagedObjectContext*)getCurrentThreadContext{
NSManagedObjectContext *result = nil;
if ([NSThread isMainThread])
result = _defaultManagedObjectContext;
else
result = [self getContextForBGTask];
return result;
}
И метод для фетча:
- (NSArray*)getObjectsOfType:(NSString*)type
withSortDescriptors:(NSArray*)descriptors
andPredicate:(NSPredicate*)predicate
inContext:(NSManagedObjectContext *)context {
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setReturnsObjectsAsFaults:NO];
NSEntityDescription* desc = [NSEntityDescription entityForName:type inManagedObjectContext:context];
[request setEntity:desc];
if (descriptors)
[request setSortDescriptors:descriptors];
if (predicate)
[request setPredicate:predicate];
NSError* error = nil;
NSArray* result = nil;
result = [context executeFetchRequest:request error:&error];
if ((result == nil) || (error != nil))
return nil;
return result;
}
Тогда вызов из любого участка кода будет сводиться к следующему:
NSManagedObjectContext *context = [[CoreDataManager sharedManager] getCurrentThreadContext];
NSArray *result = [[CoreDataManager sharedManager] getObjectsOfType:@"Car"
withSortDescriptors:nil
andPredicate:nil
inContext:context]
Sign up to leave a comment.
Многопоточная Core Data