Я использую AFNetworking и MagicalRecord (текущая ветвь разработки), и я пытаюсь выяснить, как импортировать множество объектов, которые зависят друг от друга. Каждый ресурс/объект имеет несколько загрузок. У меня есть класс, управляющий загрузками для данного объекта и сохраняющий их с помощью MagicalDataImport (что было потрясающе).Импорт с MagicalRecord + AFNetworking
Я считаю, что моя проблема заключается в том, что импорт не происходит в той же теме. Поэтому я думаю, что происходит следующее:
- В одном потоке EntityA правильно сохраняется и распространяется на родительский объект.
- Затем в другом потоке EntityB сохраняется, и вместе с этим создается его отношение к EntityA. Это означает, что создается пустой объект (ошибка?). Затем, когда он распространяется на родительский объект, я считаю, что EntityA перезаписывает EntityA, который есть. Таким образом, у меня остались некоторые объекты, у которых нет всех атрибутов.
По крайней мере, я думаю это то, что происходит. То, что я вижу через пользовательский интерфейс, на самом деле состоит в том, что отношения между объектами не всегда построены правильно.
Моя конечная цель состоит в том, чтобы весь процесс загрузки/импорта выполнялся в фоновом режиме, не создавая пользовательский интерфейс.
Вот мой AFJSONRequest:
AFJSONRequestOperation *operation = [AFJSONRequestOperation
JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
[self saveResources:[JSON objectForKey:@"data"]];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
{
DLog(@"%@",error.userInfo);
[self.webService command:self didFail:error.localizedDescription];
}];
[operation setQueuePriority:self.priority];
И это вызывает saveResources:
:
- (void)saveResources:(NSArray*)resources {
BOOL stopDownloads = [self stopDownloadsBasedOnDate:resources];
if ([resources count] > 0 && !stopDownloads){
self.offset = @([offset intValue] + [resources count]);
[self send];
}
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *blockLocalContext) {
[self.classRef MR_importFromArray:resources inContext:blockLocalContext];
} completion:^(BOOL success, NSError *error) {
if (error){
// ... handle errors
}
else {
// ... handle callbacks
}
}];
}
Это пинает другую загрузку ([self send]
), а затем сохраняет объекты.
Я знаю, что по умолчанию AFNetworking вызывает обратный вызов в основной очереди, и я попытался установить SuccessCallbackQueue
/FailureCallbackQueue
на мой фоновый поток, но это, похоже, не решает все проблемы, у меня все еще есть отношения к поврежденным объектам, хотя я думаю, что мне нужно сделать это, чтобы все происходило в фоновом потоке.
Есть ли что-то еще, что мне нужно для вызова, чтобы правильно распространять эти изменения в главном контексте? Или есть другой способ, которым я должен настроить это, чтобы убедиться, что все объекты сохранены правильно, и отношения правильно построены?
Обновление Я переписал вопрос, чтобы попытаться дать больше разъяснений по этим вопросам.
Update
Если вам нужно больше кода я created a gist с (я считаю) все.
Можете ли вы опубликовать весь блок завершения AFNetworking, который вы пытаетесь использовать? Может помочь дать немного больше контекста. –
Что касается вопроса о формате JSON Format, мы делаем импорт так, как этот вопрос предполагает, что он не должен работать, и он работает нормально. Вам просто нужно убедиться, что идентификаторы правильно отображаются в качестве первичного ключа и что ключ сопоставления отношений правильный. –
@CoryImdieke - Я обновил свой вопрос. Я считаю, что все мои сопоставления отношений верны (я все время смотрю на это). У меня есть первичный ключ ('relatedByAttribute'), определенный на самой модели и на отношении. У отношений есть 'relatedByAttribute' и' mappedKeyName'. Благодарю. – RyanJM