8

이 작업을 수행하는 올바른 방법은 무엇입니까?GCD 직렬 대기열에서 NSTimers를 예약하고 무효화하는 것이 안전합니까?

특별 고려 사항

당신은 타이머가 설치된 의 스레드에서이 메시지를 전송해야 다음 NSTimer 문서는이 말한다. 다른 스레드에서이 메시지를 보낼 경우, 타이머와 관련된 입력 소스가 제대로 을 종료에서 스레드를 방지 할 수있는 그 런 루프에서 를 제거되지 않을 수 있습니다. GCD 이후

는 항상 동일한 스레드에서 블록을 실행하는 일련 큐, 당신은 예약과 동일한 스레드에 NSTimer을 무효화하도록 올바른 방법으로 무엇을 당신을 확신하지 않는 이유는 무엇입니까?

편집 :

아래의 대답의 조언에 따라, 나는 어떤 큐에서 사용할 수있는 GCD를 사용하여 사용자 정의 타이머 구현 인 MSWeakTimer (https://github.com/mindsnacks/MSWeakTimer를) 만들었습니다.

+0

하나는 우리의 끔찍한 메모리 문제를 해결했다! – jowie

답변

9

당신은 GCD에 의해 관리 익명 작업자 스레드 상에 NSTimer를 설치해서는 안된다. 대신 NSTimer의 GCD,로 페놀과

사용 파견 타이머 소스 dispatch_source_create (3).

NSTimer는 GCD 큐에 대한 의미가있는 것이 아닙니다 현재 스레드의 runloop에 의존한다. GCD 및 runloop API에 대한 자세한 내용은 WWDC2012 GCD 세션을 참조하십시오. MSWeakTimer에 대한

+0

많은 의미가 있습니다. 유일한 예외는 메인 큐가 될 것이라고 생각합니다. 맞습니까? –

+0

정확한만큼 프로세스 dispatch_main 호출하지 않는 (3), 메인 runloop 메인 큐 묶여 메인 스레드 실행을 보장한다. – das

+1

https://github.com/mindsnacks/MSWeakTimer –