Ios 将ASMX web服务返回的XML数据加载到iPhone/iPad应用程序
因此,在我的应用程序中,我从XMLWeb服务检索数据。它非常巨大。最多30-40000条记录。在模拟器上运行良好。但在设备上,它正在崩溃。我使用NSXMLParser。是的,是的。所以它在某个时刻崩溃了。然而,我在后台线程中这样做是为了不破坏我的主线程。还可以停止iOS,如果我的应用程序超过10秒,则停止退出。那么有什么办法可以纠正呢?我一直在这个时候,但没有解决办法。任何帮助都将不胜感激。谢谢Ios 将ASMX web服务返回的XML数据加载到iPhone/iPad应用程序,ios,xml-parsing,crash,record,has-many,Ios,Xml Parsing,Crash,Record,Has Many,因此,在我的应用程序中,我从XMLWeb服务检索数据。它非常巨大。最多30-40000条记录。在模拟器上运行良好。但在设备上,它正在崩溃。我使用NSXMLParser。是的,是的。所以它在某个时刻崩溃了。然而,我在后台线程中这样做是为了不破坏我的主线程。还可以停止iOS,如果我的应用程序超过10秒,则停止退出。那么有什么办法可以纠正呢?我一直在这个时候,但没有解决办法。任何帮助都将不胜感激。谢谢 0 CoreFoundation 0x3baa839c __C
0 CoreFoundation 0x3baa839c __CFBasicHashAddValue + 1452
1 CoreFoundation 0x3b9d2194 CFBasicHashAddValue + 3048
2 CoreFoundation 0x3b9d5ebc CFSetAddValue + 112
3 CoreData 0x3709b5b0 -[NSManagedObjectContext(_NSInternalAdditions) _insertObjectWithGlobalID:globalID:] + 172
4 CoreData 0x370939bc -[NSManagedObjectContext insertObject:] + 136
5 CoreData 0x370836d2 -[NSManagedObject initWithEntity:insertIntoManagedObjectContext:] + 646
6 CoreData 0x3706fd74 +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:] + 176
7 XYZ Orders 0x00146c68 -[ITMParser parser:didEndElement:namespaceURI:qualifiedName:] (ITMParser.m:393)
8 Foundation 0x36898a82 _endElementNs + 298
9 libxml2.2.dylib 0x3ad8de5a xmlParseEndTag2 + 614
10 libxml2.2.dylib 0x3ad8f546 xmlParseTryOrFinish + 1658
11 libxml2.2.dylib 0x3ad8ece8 xmlParseChunk + 208
12 Foundation 0x3689755e -[NSXMLParser parse] + 482
13 XYZ Orders 0x0017a4c4 -[ITMLoginVC getAllCustomerValues] (ITMLoginVC.m:822)
14 XYZ Orders 0x00176a6c __25-[ITMLoginVC viewDidLoad]_block_invoke_0 (ITMLoginVC.m:218)
15 libdispatch.dylib 0x39d8011c _dispatch_call_block_and_release + 8
16 libdispatch.dylib 0x39d8495c _dispatch_root_queue_drain + 248
17 libdispatch.dylib 0x39d84abc _dispatch_worker_thread2 + 80
18 libsystem_c.dylib 0x36ae9a0e _pthread_wqthread + 358
19 libsystem_c.dylib 0x36ae98a0 start_wqthread + 4
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if([elementName isEqualToString:@"NAllAddresses"])
{
NSString *temp=@"";
self.managedObjectContext = appDelegate.managedObjectContext;
//The below line happens to be the line number 393.
ITMAllCustomerAddresses *allCustAddress =(ITMAllCustomerAddresses *)[NSEntityDescription
insertNewObjectForEntityForName:@"ITMAllCustomerAddresses"
inManagedObjectContext:self.managedObjectContext];
allCustAddress.allAddID = [self numberValue:[self.mutableDictionary objectForKey:@"AllAddID"]];
allCustAddress.allCustID = [self numberValue:[self.mutableDictionary objectForKey:@"AllCustID"]];
temp =[self.mutableDictionary objectForKey:@"AllAddressLine"];
allCustAddress.allAddressLine = [self noSpaceString:temp];
temp = [self.mutableDictionary objectForKey:@"AllAddressCity"];
allCustAddress.allAddressCity = [self noSpaceString:temp];
temp = [self.mutableDictionary objectForKey:@"AllAddressState"];
allCustAddress.allAddressState = [self noSpaceString:temp];
temp = [self.mutableDictionary objectForKey:@"AllAddressZip"];
allCustAddress.allAddressZip = [self noSpaceString:temp];
[self.allCustomerAddressesArray addObject:allCustAddress];
[self.mutableDictionary removeAllObjects];
}
else
{
if([elementName isEqualToString:@"AllAddID"]||[elementName isEqualToString:@"AllCustID"] ||[elementName isEqualToString:@"AllAddressLine"]||[elementName isEqualToString:@"AllAddressCity"]||[elementName isEqualToString:@"AllAddressState"]||[elementName isEqualToString:@"AllAddressZip"])
{
[self.mutableDictionary setObject:currentElementValue forKey:elementName];
currentElementValue = nil;
}
}
您是否调查了设备的崩溃日志?似乎它正在崩溃,因为设备内存不足。尝试解析较小的文件。此外,请执行此方法:
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
捕获可能的解析错误
更新:
从崩溃日志判断,您正在后台线程上使用核心数据。请记住,NSManagedObject上下文和NSManagedObject不是线程安全的。但NSManagedObjectd是。因此,如果要解析XML并从中创建核心数据对象,请确保创建NSManagedObjectContext的新实例,如下所示:
NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] init];
[ctx setUndoManager:nil];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[ctx setPersistentStoreCoordinator: [appDelegate persistentStoreCoordinator]];
然后使用ctx创建新对象。它在哪里崩溃,崩溃日志是什么?发布您的代码..@P.J.添加了代码和崩溃日志。请检查一下,我还没做过。但是你能告诉我,如果真的可以在移动中解析30-40000条记录吗?这是我的第二个应用程序。所以我对iOS了解不多。在模拟器上也可以很好地工作。没有解析问题/错误。我将所有30-40000条记录完全解析并保存到核心数据数据库中。对于较大的文件,请尝试使用TBXML。@Jeepston。我已经使用了您建议的上下文,我可以创建对象并将它们保存到数组中。但我无法将它们保存到核心数据数据库。我像这样保存N错误*错误=零;如果(![ctx保存:&error]){NSLog(@“保存订单失败”);}。但它不会节省。没有记录。保存后返回的错误是什么?另外,创建只有一条记录的xml,并在主线程上运行解析代码。看看是否有帮助。没有错误。它没有说任何信息。我想在那种情况下,它可以拯救我们。我有一个叫做SQLItemManager的工具,它是firefox的一个插件。在那里,我可以查询底层sqlite表。当我从表名中选择*时,它的值为0。没有值。我让我的web服务只返回一条记录。仍然没有价值观。