2011-10-04 6 views
1

정기적 인 XML을 비동기 적으로 구문 분석해야 사용자가 "PullToReload"를 사용하여 UITableView를 다시로드 할 때 업데이트 된 값이로드됩니다.NSTimer를 사용하여 백그라운드에서 XML을 구문 분석하는 가장 좋은 방법은 무엇입니까

- (void) xmlParserWrapper 
{ 
... 
TBXMLParser *xmlParser = [[TBXMLParser alloc] initWithContext:context]; 
[xmlParser performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:xmlUrl]; 
} 

그래서 내가 '사용자가 원으로이만큼 잘 작동 NSTimer

{ 
... 
[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(xmlParserWrapper) userInfo:nil repeats:YES]; 
} 

를 사용하여 시도 : NSTimer을 사용하고 내 내기 ...

이미 사용 TBXML XML 파서가 파싱하는 동안 GUI를 터치하십시오. 그러나 사용자가 UITableViewCell을 클릭하면 새로운 UITableView를 UINavigationController에 푸시하고 선택된 셀 값을 기반으로 데이터를 가져옵니다. NSManagedContext는 파싱하는 동안 (그것이 채워질 때까지) 비어 있기 때문에 'Invalid predicate : nil RHS'로 인해 응용 프로그램이 손상되었습니다.

내 코드가 너무 커지기 때문에 여기에 붙여 넣을 수는 없지만 코드의 어느 부분을보아야하는지 알려 주시면 여기에 설명해 드리겠습니다.

기본적으로 XML 파싱은 응용 프로그램을 중단시키지 않는 일정한 간격으로 백그라운드에서 수행해야합니다. 사용자가 UI를 탐색 할 때 MainThread를 차단하지 않도록 다른 스레드에 있어야합니다. 사전에

감사합니다, dfox

답변

0

나는 그러나이 문제는 GUI 프레임 워크와 공통이며, 일반적으로 시간이 많이 걸리는 작업을 수행 할 배경, 또는 작업자 스레드를 사용하여 해결된다, 더 아이폰 OS 전문가가 아니야 주 GUI 스레드가 사용자 상호 작용을 처리하도록 남겨 둡니다.

  1. 이 응용 프로그램이 시작될 때 작업자 스레드를 만들고 다음과 같이

    귀하의 솔루션을해야한다.

  2. 컨테이너 (목록) 클래스를 사용하여 작업자 스레드에 대한 작업을 게시 할 '작업 대기열'을 포함시킵니다. 수행 할 각 작업 단위를 설명하기 위해 자체 클래스 또는 구조체를 구현해야합니다.
  3. 동기화 메커니즘을 사용하여 두 스레드에서 작업 큐에 대한 액세스를 제어합니다.
  4. 가능한 한 많은 작업을 작업자 스레드에서 구현하십시오. 즉, XML을 검색하고 파싱하도록하십시오. 네트워크 액세스가 여기에서 가장 시간이 많이 걸리는 작업이라고 생각했을 것입니다.
  5. 새로운 내용으로 UI 요소를 업데이트하는 작업자 스레드를 가져옵니다. 여기서도 해결할 수있는 동기화 문제가 있습니다.
  6. 응용 프로그램이 종료 될 때 작업자 스레드를 종료하십시오.

iOS에서 구현하는 방법에 대한 소개는이 Apple Documentation 스레드를 참조하십시오.

+0

제안을 주셔서 감사합니다. 나는이를 처리하고 구현하려고 노력할 것입니다. 나는 현재의 문제에 더 깊이 파고 들었다. 나는 새로운 데이터를로드하려고 할 때 그것을 알아 차렸다. 내 기존 var'@property (비 원자 유지) NSMutableArray * entityArray'가 비게됩니다. 나는 당신의 충고를 시도하고 더 이상 얻을 수 있는지 보겠습니다. 감사합니다. – dfox

관련 문제