2

정기적 인 서버 동기화 프로세스를 실행하는 iPad 앱이 있습니다. 10 초마다 실행됩니다. 동기화 프로세스는 CoreData SQL 기반 저장소에 삽입 된 레코드를 다운로드합니다. 경우에 따라 처리되는 레코드 수를 수백 또는 수천 개로 줄일 수 있습니다.NSOperation과 비동기 NSURLConnection

현재 동기화 프로세스는 주 스레드에 의해 트리거 된 Asynchronous NSURLConnection을 기반으로합니다. 모든 NSDataasync 호출에 의해 수집되면 주 스레드는 백그라운드에서 NSOperation을 실행하여 NSData을 구문 분석하고이를 db에 삽입합니다.

따라서 NSURLConnection은 비동기 적으로 실행되며 db insert는 백그라운드에서 실행 중입니다. NSOperation. 그러나 NSURLConnectionNSOperation의 오케스트레이션은 주 스레드에서 수행됩니다. 많은 양의 데이터가 다운로드되었다는 것을 감안할 때, 메인 스레드에서이 작은 양의 오케스트레이션이 내 UI 응답에 영향을 줄 수 있다고 생각합니다.

그래서 코드를 단일 배경 NSOperation으로 리팩터링하고 NSURLConnection을 동기 호출로 만들려고합니다. 하나의 NSOperation은 동 기적으로 NSData을 다운로드하고 db 삽입을 관리합니다.

상당한 리팩토링에 착수하기 전에 나는 이것이 좋은 결정인지 여부에 대한 사람들의 견해에 관심이있을 것입니다.

현재 메커니즘을 통해 UI에서 가끔씩 주저하는 것을 보았습니다. 백그라운드에서 전체 메커니즘을 배치함으로써 NSOperation 나는 UI가 응답 성이 유지되기를 바라고 있습니다.

지혜의 모든 단어는 매우 감사하겠습니다.

감사합니다.

답변

2

동기 연결로 전환하지 않는 것이 좋습니다. 비동기 연결은 메모리를 적게 사용하며 다운로드 프로세스를보다 효율적으로 제어 할 수 있습니다. UI의 동결을 방지하기 위해, 그래서 같이 만 NSURLConnection 대리자 메서드 내부의 백그라운드 처리를 강제로 시도 할 것이다 :

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [self.mutableData appendData:data]; 
    }); 
} 

편집 : 댓글에 명시된 @jrturton, 당신은 NSURLConnection 위임 방법에 대한 대기열을 지정할 수 있습니다. setDelegateQueue: 방법을 사용하십시오 (iOS 5.0 이상).

+0

NSURLConnection 대리자 메서드가 처리되는 큐를 지정할 수 있지만이 코드는 필요하지 않습니다. – jrturton