MagicalRecord saveWithBlock:没有错误,没有成功

时间:2014-01-29 03:07:37

标签: ios magicalrecord

使用[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 add object, different context error)之前出现的,我通过使用localContext在解析数据时创建实体来修复它。我现在也这样做了,但问题又回来了,所以也许其他事情正在发生?

使用AFNetworking框架获取数据,并在importData: GET调用的completionBlock中调用AFHTTPSessionManager

如果我在NSLog电话中设置断点,我会看到很多线程是开放的,也许这是一个线索?

编辑:我已经检查过解析器没有返回错误。

更新: 这是根元素的代码,它通过整个xml文件这样进行。一旦找到“条目”,它将解析该条目,并添加节点等等。此设计模式基于BNR iOS书中的RSS示例项目。

-(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];
                           }
                       }
                   }];

EDIT3:好的,我可能预感正在发生的事情。我唯一一次遇到这种情况(错误是nil,成功是NO),就是我在for循环中多次调用myAFNetworkingClient searchForQuery(用数据库中的新条目更新一堆条目),以及对于每个调用,可以使用/可以使用不同的localContext,对吧?因此,当解析xml并创建实体时,这会发生在不同的上下文中。现在,如果两个xml文件都包含两个条目相同的元素(让我们说一个人),该怎么办?如果一个解析器已经为Entity创建了Person,然后第二个解析器也需要稍后执行该操作,那么是否会导致冲突,因为Person已经存在?我在这里走在正确的轨道上吗?如果是这样,有没有办法绕过这个?

0 个答案:

没有答案
相关问题