2009-12-05 5 views
0

나는이 웹에 대한 답변을 찾고 있었지만 답변을 찾지 못했습니다. 다른 측면에서는 꽤 일반적인 것 같아서 여기에 몇 가지 키워드가 누락되었을 가능성이 있습니다. 어쨌든 문제는 다음과 같습니다 :코코아 콜백은 언제 제어됩니까?

ObjC (iPhone)의 콜백 함수는 언제 제어됩니까?

runloop을 담당하는 계층 구조 클래스의 상위 부분에 제어가 제공된 후에 발생합니까? 다른 함수 호출이 실행되는 중간에 발생할 수 있습니까?

예를 들어

,의는 있는 NSURLConnection 보자, 우리는 모른다거나 didReceiveResponse GET의 호출하는 경우가 있습니다, 그것은 didReceiveResponse 또는 다른 콜백 메소드를 호출하는거야 때 예측할 수 없습니다 내가 다른 기능의 중간에있을 때? 실제로, Kaspa

답변

4

은 내가 다른 함수의 중간에있어 때 didReceiveResponse GET 이 호출하는 경우가 될 수 있습니까?

아니요, 단일 스레드 내에서 코드가 병렬로 실행되지 않습니다. runloop은 모든 메시지의 실행을 예약하고 순서대로 디스패치합니다. NSTimers조차도 이론상 가능한 정확도로 발사 할 수 있습니다. 다른 모든 것처럼 runloop을 기다려야하기 때문입니다.

+0

다음 나는 (내가 전에 생각처럼)있는 NSURLConnection은 후드 아래에 새 스레드를 생성하지 않는 것으로 가정한다. 그렇다면 어떻게 비 동시성을 달성 할 수 있을까요? 더 많은 정보를 얻고 싶습니다. CocoaTouch의 어떤 클래스가 실행 루프를 담당합니까? – Kaspa

+0

클래스는 NSRunloop.NSURLConnection입니다. 스레드와 runloops와의 상호 작용을 관리하는 몇 가지 방법이 있습니다. 하드웨어 인터럽트를 사용하는 장치 드라이버처럼 비동기 적으로 작동한다고 저는 믿지 않습니다. 대신, 그것은 중요한 일이거나 신중한 스케줄링입니다. – TechZen

1

콜백은 함수의 중간에 호출되지 않습니다

건배 (높은 것을 의심하지만 실행 루프의 끝 기다림 콜백에 대한 정보를 찾을 수 없습니다). 이벤트를 처리하기 위해 메인 runloop에 제어권을 다시 주어야하며 콜백을 호출해야합니다.

콜백을 정확하게 호출하는 사람을 알고 싶으면 중단 점을 넣고 스택 추적을 확인하십시오.

0

다른 스레드가 실행되는 동안 didReceiveReponse가 호출되는 유일한 시간은 자체 스레드 (일반적으로 NSOperation)에서 연결을 시작한 경우입니다.

배경 스레드에 연결되어있는 경우 일반적으로 performSelectorInMainThread와 같은 것을 사용하여 응용 프로그램의 다른 부분에 대한 값을 변경합니다 - 속성이 비 원자로 표시되지 않고 변경할 수없는 경우 직접 조정할 수는 있지만 컬렉션.

0

기본적으로 기본적으로 모든 코코아 터치 클래스는 백그라운드 네트워크 호출과 같은 많은 비동기 작업을 포함하여 완전히 단일 스레드로 작동합니다. 주요 예외는 NSOperation과 친구, NSThread와 관련된 것입니다.

OS는 실행 루프 일정에 콜백을 삽입하여이를 수행 할 수 있습니다. 또한 하나의 호출이 동일한 스택에서 콜백을 발생시키는 경우도 있습니다 (예 : UITextField와 같은 경우이 경우 대리자에게 알리는 객체에서 resignFirstResponder를 호출하는 경우).

몇 관련 블로그 게시물 :이 경우

관련 문제