2013-01-24 1 views
0

그래서 내 앱에서 XML 웹 서비스의 데이터를 검색합니다. 매우 거대한. 최대 30-40000 개의 레코드까지. 시뮬레이터에서 잘 작동합니다. 그러나 장치에 그것은 부서지고있다. NSXMLParser를 사용합니다. didStartElement, didEndElement. 그래서 어떤 시점에서 충돌합니다. 그러나 나는이 메인 스레드를 깨지 않기 위해 백그라운드 스레드에서 이것을 수행하고있다. 또한 iOS가 10 초 이상 지속되면 앱을 시작하지 못하게합니다. 그래서 어떤 생각을 해결할 수있는 방법. 나는이 시간에 있었지만 해결책은 없었다. 어떤 도움을 주시면 감사하겠습니다. 감사.ASMX 웹 서비스에서 XML로 반환 된 데이터를 iPhone/iPad에 충돌 어플리케이션

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 *[email protected]""; 
    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; 
    } 
} 
+0

어디에서 충돌이 발생합니까? 충돌 로그는 무엇입니까? 코드를 게시하십시오 .. –

+0

@ P.J. 코드 및 충돌 로그가 추가되었습니다. 그걸 확인해주세요. – RookieAppler

답변

1

기기의 오류 로그를 조사 했습니까? 기기의 메모리가 부족하기 때문에 충돌하는 것 같습니다. 작은 파일을 파싱 해보십시오. 또한이 방법을 구현하면

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 

가능한 구문 분석 오류를 catch 할 수 있습니다.

업데이트

: 당신의 충돌 로그에서 판단

, 당신은 백그라운드 스레드에서 코어 데이터를 사용하고 있습니다. NSManagedObjectContext 및 NSManagedObject는 스레드로부터 안전하지 않습니다. 하지만 NSManagedObjectID입니다.

NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] init]; 
[ctx setUndoManager:nil]; 

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
[ctx setPersistentStoreCoordinator: [appDelegate persistentStoreCoordinator]]; 

을하고 새로운 개체를 만드는 데 CTX를 사용하면 XML을 구문 분석하고 그것에서 코어 데이터 객체를 생성하는 경우 그래서,이 같은 NSManagedObjectContext의 새 인스턴스를 만들 있는지 확인하십시오.

+0

Havent 그. 그러나 실제로 이동 중에도 30-40000 개의 레코드를 파싱 할 수 있는지 알려주실 수 있습니까? 이것은 두 번째 앱입니다. 그래서 나는 iOS에 관해 많이 모른다. 또한 시뮬레이터에서 잘 작동합니다. 구문 분석 문제/오류가 없습니다. 30-40000 개의 모든 레코드를 완벽하게 파싱하여 코어 데이터 DB에 저장합니다. – RookieAppler

+0

큰 파일의 경우 TBXML을 사용해보십시오. – Jeepston

+0

@ Jeepston.I 제안한대로 컨텍스트를 사용했습니다. 개체를 만들어 배열에 저장할 수 있습니다. 하지만 핵심 데이터 DB에 저장할 수 없습니다. 나는 이런 식으로 저장하고있다 \t NSError * error = nil; \t if (! [ctx save : & error]) \t { \t \t NSLog (@ "주문 저장 실패"); \t}. 그러나 그것은 저장하지 않을 것이다. 기록이 없습니다. – RookieAppler