Каковы наилучшие методы обновления исходных данных?Обновление основных данных в классе модели
Первый парень, который работал над этим проектом, над которым я работаю, теперь создал все связанные с Core Data функции внутри ViewController, но я хотел объявить их внутри классов модели (подкласс NSManagedObject), чтобы разделить проблемы.
Основная функция - AFP Networking postPath, которая вызывает веб-службу и возвращает массив объектов для добавления/редактирования/удаления. То, что я сделал, было создать метод класса и сделать это AFNetwork вызов внутри него:
+ (void)updateEbooksListWithSuccessBlock:(void (^)())successBlock andFailureBlock:(void (^)())failureBlock {
NSURL *url = urlSchema (urlWebServices, @"");
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSString *postPath = [NSString stringWithFormat:@"ws-ebooks-lista.php"];
[httpClient postPath:postPath parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
if ([operation isKindOfClass:[AFHTTPRequestOperation class]]) {
NSDictionary *result = [[responseObject objectFromJSONData] retain];
bool success = statusDoRetornoDoWebService(result); //Function that checks if the return was successful
//Configura o Core Data
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSManagedObjectContext *localManagedObjectContext = [[NSManagedObjectContext alloc] init];
[localManagedObjectContext setParentContext:[(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ebooks" inManagedObjectContext:localManagedObjectContext];
NSPredicate *filterPredicate;
[request setEntity:entity];
if (success) {
NSArray *ebookInfos = [result objectForKey:@"saida"];
Ebooks *ebook;
NSManagedObject *objectInsert;
for (NSDictionary* ebookInfo in ebookInfos) {
filterPredicate = [NSPredicate predicateWithFormat:@"ebooks_id == %@",[ebookInfo valueForKey:@"id_ebook"]];
[request setPredicate:filterPredicate];
ebook = [[localManagedObjectContext executeFetchRequest:request error:&error] lastObject];
objectInsert = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:localManagedObjectContext];
if (ebook) {
if (![[ebookInfo valueForKey:@"excluido"] isEmpty]) {
//Delete Ebook
} else {
//Update Ebook
}
} else {
//Add Ebook
}
if (![localManagedObjectContext save:&error]) {
//Log Error
}
[objectInsert release];
}
}
[request release];
[localManagedObjectContext release];
}
[successBlock invoke];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//Failure
[failureBlock invoke];
}];}
И это прекрасно работает в то время как приложение работает, но если я его закрыть (через Xcode) и открыть его снова, изменения Арен Не спасен. Я попробовал не использовать «родительский контекст» и просто использовать контекст управляемого объекта AppDelegate (поскольку обратные вызовы AFNetworking всегда выполняются в основной очереди), но не имеют успеха: данные не сохраняются. Почему это? Я делаю что-то неправильно? Это плохая практика? Должен ли я оставить все в контроллере просмотра так, как это было?
Спасибо!
Мне понравилось ваше объяснение, но это заставило меня задуматься: что, если в моем примере мне нужно было обновить список Ebooks в другом (несвязанном) контроллере? Скажите боковое меню, которое имеет ярлык для этого списка. Повторю ли код? – dccarmo
Нет, у вас должен быть класс 'EbookManager', который позаботится об этой логике. Используйте singleton для инкапсуляции этой функции. – Mundi
Хорошо, я принял ваш ответ. Просто быстрое наблюдение: что, если мне нужно создать функцию для загрузки книги и сохранить в основных данных информацию о загрузке. Должно ли быть выполнено в классе ViewController или Model?Кажется разумным поставить его в модельный класс, поскольку он имеет дело прямо с сущностью. – dccarmo