В моем проекте iOS Objective C у меня есть требование загрузить некоторые данные в облако, и как только мы получим ответ, обновите serverId в моих записях, которые находятся в основных данных
, следующее: updateDetailsIntoCoreData
', который я написал, где я каждый раз создаю новый дочерний NSManagedObjectContext, а updateDetailsIntoCoreData вызывается для каждого объекта ответа, т.е. скажем, если я загружаю 100 пакетов на сервер, я получаю 100 ответов обратно, а метод updateDetailsIntoCoreData
вызывается 100 раз, поэтому создается 100 дочерних NSManagedObjectContexts, и все 100 записей обновляются в основных данных должным образом, но здесь я думаю, что делаю что-то не так можно ли создать много (например, 100 в этом case) child NSManagedObjectContexts ?
Я также попытался создать единственный дочерний NSManagedObjectContext и передал его методу updateDetailsIntoCoreData
, но в этом случае все мои 100 записей не были обновлены должным образом на сервере детали, но были обновлены только несколько строк.
- (void)updateDetailsIntoCoreData:(MyModel *)session
callBackHandler:(void (^)(Error))completionHandler
{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:self.entityName];
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"id==%@",session.id];
[fetchRequest setPredicate:predicate];
NSManagedObjectContext *updateContext = [self createPrivateManagedObjectContext];
__weak typeof(self) weakSelf = self;
[updateContext performBlock:^{
__strong typeof(self) strongSelf = weakSelf;
NSArray *data = [updateContext executeFetchRequest:fetchRequest error:nil];
if (data.count) {
MyEntity *entity=[sessions lastObject];
[strongSelf setServer Values:entity withSession:session];
NSError *error = nil;
[updateContext save:&error];
[strongSelf.managedObjectContext performBlockAndWait:^{
//Save with CompletionHandler
[strongSelf saveContext:completionHandler];
}];
}else{
completionHandler(error);
}
}];
}
createPrivateManagedObjectContext
Метод
-(NSManagedObjectContext *)createPrivateManagedObjectContext{
NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc]initWithConcurrencyType: NSPrivateQueueConcurrencyType];
[privateContext performBlockAndWait:^{
[privateContext setParentContext:self.managedObjectContext];
}];
return privateContext;
}