2012-05-06 2 views
1

저는 네이티브 연락처를 서버에 업로드 한 다음 응답을받습니다 (JSON, 이미 앱을 설치 한 연락처 목록). 기본 연락처가 충분히 크면 서버 응답이 느리고 불안정합니다. 그리고 사용자는 다른 일을 할 수 없습니다. 그래서 네트워크 요청을 백그라운드 스레드에 넣습니다. 100 개의 연락처를 업로드 할 때마다 루프 작업이 완료 될 때까지 몇 가지 작업을 수행 한 다음 다음 100 개의 연락처를 수행합니다.내 배경 작업 스레드가 UI 스레드를 차단하는 이유는 무엇입니까?

그러나 실행 중 예상대로 결과가 아닙니다. 백그라운드 스레드가 실행 중이면 서버를 계속 요청합니다. UI 스레드가 차단되었지만 여전히 아무 것도 할 수 없습니다.

이것은 백그라운드 스레드에서 긴 루프가 발생합니까? 내가 2 스레드지만, 그들은 (테스트 장치는 아이팟, 1 코어입니다 CPU 리소스를 경쟁 할 것입니다. 그리고 이것은 관련된 핵심 숫자가 아닌 것 같아요)?

아무도 이런 종류의 시나리오를 처리하는 방법에 대한 힌트를 말할 수 있습니까? 미리 감사드립니다!

업데이트 : 근본 원인을 발견

. App 대리자의 전역 변수가 잘못된 값으로 설정되므로 UI ​​동작이 이상합니다. 나는 모든 네트워크 요청 방법을 주석으로 알았다. 따라서이 문제는 다중 스레딩과 관련이 없습니다. 귀찮게해서 미안해.

+0

GCD를 사용하고 있습니까? – CodaFi

+0

@CodaFi 아니요. 애플리케이션 위임에 NSOperationQueue를 사용합니다. 100 개의 대화 상대에 대한 모든 요청이 대기열로 전달됩니다. – LetBulletFlies

+0

더 좋은 질문은 GCD를 사용할 수 있습니까? 아니면 iOS 3.x를 타겟팅해야합니까? – CodaFi

답변

0

네트워크 작업을 수행하는 방법에 대한 설명이 필요하다고 생각합니다.

NSOperatiomQueue는 NSOperations를 처리하므로 NSOperation 하위 클래스에서 네트워크 코드를 래핑하는 것으로 추정됩니다.

둘째, 네트워킹 코드에 NSURLConnections를 사용하고 있습니까?

제 3의 NSURLConnection을 차단하는 부분입니까, 아니면 NSURLConnection의 콜백을 위임합니까?

주목할 점은 NSURLConnections가 멀티 쓰레 디드 환경에서 구현된다는 것입니다. 객체는 기본 스레드 실행 루프에 기본적으로 배치되지만 (주 스레드에서 실행될 때) 객체는 다른 스레드에서 발생하는 하위 수준 네트워킹 코드 (BSD 소켓)의 대리자에 대한 콜백을 처리하는 래퍼입니다.

A) 위임 콜백 메소드에서 값 비싼 코드로 스레드를 차단하지 않거나 B) 너무 많이 실행 루프를 압도하지 않는 한, 메인 스레드에서 NSURLConnections로 UI를 차단하면 안됩니다. 동시 URL 연결 (NSOperationQueue의 setMaxConcurrentOperationsCount :가 작동하는 곳)

+0

Thx. 내 대답 : 첫째, 네, 네트워크 요청 방법을 래핑 NSInvocationOperation 사용하고 있습니다. 둘째/셋째, 아니, SDK를 사용하여 서버 요청, 그것은 동기화 호출입니다. – LetBulletFlies

+0

Appdelegate를 여러 스레드에서 액세스 할 수 있는지 궁금합니다. 서버 요청 메서드는 응용 프로그램 대리인에 있으며 백그라운드 스레드에서 호출됩니다. 나는 그것을 다른 곳에 옮겨서 시도 할 것이다. – LetBulletFlies

관련 문제