使用[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
已经存在?我在这里走在正确的轨道上吗?如果是这样,有没有办法绕过这个?