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 уже существует? Я на правильном пути здесь? И если так, есть ли способ обойти это?

0 ответов

Другие вопросы по тегам