MagicalRecord saveWithBlock: нет ошибки, нет успеха
При импорте данных с использованием [MagicalRecord saveWithBlock:]
обработано NSXMLParser
Я иногда получаю ситуацию, когда ошибка равна нулю, а успех - НЕТ:
- (void) importData:(NSData *) data
{
[MagicalRecord saveWithBlock: ^(NSManagedObjectContext *localContext) {
Root *rootObject = [[Root alloc] init];
rootObject.context = localContext;
NSXMLParser *parser = [[NSXMLParser alloc] initWithData: data];
parser.delegate = rootObject;
[parser setShouldProcessNamespaces: YES];
[parser parse]
}
completion: ^(BOOL success, NSError *error) {
if (error)
{
// show alert
}
else if (success)
{
// update UI
}
else
{
NSLog(@"no error, no success");
}
}];
Это происходило раньше ( добавление объекта Magical Record, другая ошибка контекста), и там я исправил это, используя localContext для создания сущностей при разборе данных. Я делаю это и сейчас, но проблема вернулась, так что, может быть, что-то еще происходит?
Данные получены с использованием AFNetworking
рамки и importData:
вызывается из блока завершения AFHTTPSessionManager
ПОЛУЧИТЬ звонок.
Если я поставлю точку останова на NSLog
звоните, я вижу, что много тем открыто, может быть, это ключ?
РЕДАКТИРОВАТЬ: я проверил, что парсер не возвращает ошибку.
ОБНОВЛЕНИЕ: Это код для корневого элемента, и он прогрессирует таким образом через весь XML-файл. Как только он находит "запись", он анализирует ее, добавляет узлы и т. Д. И т. Д. Этот шаблон проектирования основан на примере проекта RSS в книге BNR iOS.
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString: @"entry"])
{
Entry *e = [Entry MR_createInContext: self.context];
// Entry *e = [Entry MR_createEntity];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
e.dateModified = [dateFormatter dateFromString: attributeDict[@"modified"]];
e.version = attributeDict[@"version"];
[e setContext: self.context];
[e setParentParserDelegate: self];
[parser setDelegate: e];
if (!self.entries)
self.entries = [[NSMutableArray alloc] init];
[self.entries addObject: e];
}
}
Этот код работает безупречно при добавлении одной (1) записи. Если я импортирую несколько одновременно, я иногда получаю ситуацию "нет успеха, нет ошибки".
EDIT2: это код, который вызывает метод importData:
[myAFNetworkingClient searchForQuery: queryString
withParameters: nil
completion: ^(NSData *data, NSError *error) {
if (data && data.length) {
[self importData: data];
} else {
if ([error code] != NSURLErrorCancelled)
{
[error showAlert];
}
}
}];
РЕДАКТИРОВАТЬ3: Хорошо, я могу догадаться, что происходит. Единственный раз, когда я получаю эту ситуацию (ошибка ноль, а успех НЕТ), это когда я звоню myAFNetworkingClient searchForQuery
много раз в цикле for (для обновления группы записей новыми в базе данных), и для каждого вызова используется / может использоваться другой localContext, верно? Таким образом, когда анализируется xml и создаются сущности, это происходит в разных контекстах. Теперь, что если два файла xml оба содержат элемент (скажем, человека), который одинаков для двух записей? Если один парсер уже создал Entity
за Person
и затем второй синтаксический анализатор также должен будет сделать это позже, это вызовет конфликт, потому что Person
уже существует? Я на правильном пути здесь? И если так, есть ли способ обойти это?