2012-05-29 8 views
2

나는 분석을 위해 외부 라이브러리를 사용하는 응용 프로그램을 가지고 있습니다. 문제는 내가 동기를 잡아서 내 스레드를 차단하고 워치 독이 내 앱을 10 초 (0x8badf00d 코드) 후에 죽이게하는 몇 가지 사항을 의심한다. 그것은 재현하기가 정말로 어렵습니다 (나는 할 수 없습니다). 그러나 "야생에서"거의 사례가 없습니다.실행 루프를 사용한 네트워킹

나는 다른 스레드를 만드는 대신 run-loops를 사용해야한다는 몇 가지 문서를 읽었습니다. 불행히도 내가 그 (것)들에 대해 더 많이 읽을수록 혼란스러워집니다./

무엇을 달성하려고하는 것은 :

메인 스레드에서

호출 실행 루프에 작업을 추가 그리고 난이 원하는 마지막 것은 더 많은 문제를 일으킬 것입니다 수정을 해제입니다 하나의 함수 : initMyAnalytics(). initMyAnalytics()가 네트워크 데이터를 기다리는 동안 잠긴 경우에도 내 스레드는 계속 실행됩니다. initMyAnalytics()가 끝나면 조용히 종료되고 결코 다시 호출되지 않습니다 (그래서 루프 나 아무것도 안됩니다).

아이디어를 얻으려면 어떻게해야합니까? 코드 예제 환영합니다;) 감사합니다!

답변

2

그런 경우 실행 루프를 사용할 필요가 없습니다. 실행 루프의 목적은 특정 스레드에서 여러 소스의 이벤트를 순차적으로 처리하고 아무 것도하지 않을 때 유휴 상태를 유지하는 것입니다. 물론 스레드를 분리하고 실행 루프를 만들고 함수의 소스를 추가하고 함수가 끝날 때까지 실행 루프를 실행할 수 있습니다. 세미 트레일러 트럭을 사용하여 식료품을 집으로 가져갈 수있는 것과 같습니다.

여기서 필요한 것은 디스패치 대기열입니다. 디스패치 큐는 작업을 비동기 적으로 실행하는 선입 선출 (First-In-First-Out) 데이터 구조입니다. 실행 루프와 달리 디스패치 큐는 특정 스레드에 연결되지 않습니다. 작업 스레드는 필요할 때 자동으로 생성되고 종료됩니다.

실행할 작업이 하나뿐이므로 디스패치 대기열을 만들 필요가 없습니다. 대신 기존 글로벌 동시 대기열을 사용합니다. 동시 대기열은 하나 이상의 작업을 동시에 실행합니다. 이는 우리의 경우에 완벽합니다. 그러나 실행할 태스크가 많고 각 태스크가 전임자가 끝날 때까지 기다려야하는 경우 직렬 대기열을 만들어야합니다.

그래서 당신이해야 할 모든은 다음과 같습니다

  • 가로 둘러싸하여 함수에 대한 작업을 만들 Block
  • dispatch_get_global_queue
  • dispatch_async를 사용하여 큐에 작업을 추가하여 글로벌 큐를 얻을 수 .
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    initMyAnalytics(); 
});

DISPATCH_QUEUE_PRIORITY_DEFAULT0 평가 매크로이다. 우선 순위가 다른 다른 글로벌 대기열을 사용할 수 있습니다. 두 번째 매개 변수는 나중에 사용하기 위해 예약되어 있으며 항상 0이어야합니다.

+0

완벽한 답변 (작동하는 경우 :>), 감사합니다! – Siegfried

관련 문제