2014-04-20 1 views
0

이미지 업로드 작업을 수행하는 NSURLConnection이 있습니다.NSRunLoop NSURLConnection 및 키보드 입력 문제가 발생했습니다.

_connection = [[NSURLConnection alloc] 
       initWithRequest:request 
         delegate:self 
       startImmediately:NO]; 

[_connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
         orMode:NSDefaultRunLoopMode]; 
[_connection start]; 

가 실제로 자신의 dispatch_queue에 dispatch_async와 다른 곳에서이 메서드를 호출 : 나는 초기화하고이 연결을 시작하는 방법이다. 문제는 이미지가 업로드되고 키보드로 내 앱에서 타이핑을 시작하는 경우입니다. 가끔은 애플리케이션이 정지됩니다. 조금 파고 들기 시작한 후에 키보드 버튼 누름과 같은 입력 요청을 처리하는 것이 실제로 있다는 것을 이해하게되었습니다. 나는 그것이 올바른지 알기를 원했고 이것이 내 문제를 실제로 일으키는 원인이되어 내 앱을 멈추게합니다. 이 문제와 관련된 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

P.S : currentRunLoop에서 연결을 실행하려고했지만 수동으로 currentRunLoop을 시작하지 않으면 작동하지 않습니다.

+1

NSDefaultRunLoopMode 대신 NSRunLoopCommonModes를 사용하면 UI 관련 활동이 길어질 때 (예 : 스크롤보기 스크롤) 해당 UI가 계속 호출되는지 확인할 수 있습니다. – Rob

+0

BTW, 위의 코드는 백그라운드 대기열에서 요청을 시작하는 경우에만 필요합니다. 그렇지 않으면'initWithRequest : delegate :'그냥해라. 나는 당신의 문제가 위의 코드에 있다고 생각하지 않는다. 이 질문이 귀하의 질문과 관련이 있습니까 (충돌이 아닌 동결입니까?). 그리고 UI가 정지되거나 단순히 네트워크 활동이 중단된다고 말하는 것이 "정지"라고 할 때? – Rob

답변

0

비동기 NSURLConnection은 실행 루프 내에서 실행됩니다. 따라서 메인 스레드/메인 runloop을 사용하거나 다른 스레드를 생성하고 거기에 별도의 runloop을 시작하는 두 가지 옵션이 있습니다. 나중의 경우 [NSRunLoop mainRunLoop] 대신 [NSRunLoop currentRunLoop]을 사용해야합니다.

메인 스레드/메인 런 루프를 사용하는 것이 좋습니다. 비동기 NSURLConnection은 매우 효율적입니다. 주 스레드에서 많은 것을 실행하는 데 아무 문제가 없습니다. 델리게이트 메서드에서 매우 비싼 물건을 사용하지 않는 한 성능 문제는 알 수 없습니다.

메인 스레드에서 코드를 실행하면 모든 것이 잘됩니다.

관련 문제