2012-04-12 1 views
1

나는 아이폰 OS에서의 VoIP 핸드셋 애플리케이션합니다 (PJSIP 라이브러리를 사용)를 짓고 있어요, 그리고 PJSIP는 스레드로부터 안전 목적을 액세스하고 구성을 관리하는 스레드를 등록해야합니다. 즉, 해당 라이브러리에 대한 호출을 처리하거나 관리하는 것은 GCD에서 처리 할 수 ​​없으므로 기본 스레드 (문제가 발생하면 UI가 그려지지 않고 UI가 그려지지 않는 끔찍한 솔루션)에 있어야하거나 자신 만의 전용 스레드를 만들어야합니다 .iOS에서는 특정 싱글 톤 객체에 대한 모든 동작을 전용 스레드에서 수행 할 수있는 방법이 있습니까?

내 응용 프로그램 대리인에서 내 전용 스레드와 runloop을 만들고 일부 선택기를 수행했지만 지저분합니다. 현재 세션에 대한 모든 호출을 시작시 생성하고 해당 호출이 모두 자신의 스레드에서 발생하는 단일 객체로 캡슐화하려고합니다.

Apple의 설명서는이 PJSIP 인스턴스에서 등록 된 스레드를 관리하는 데 더 지능적인 방법이 있는지 알아 내려고하기 때문에 약간 희소합니다. 지옥, 내가 생각조차하지 못한 뭔가가있을 수 있습니다.

나는 기술적 인 질문이 더 많음을 알고 있지만 사람들이 생각해내는 아이디어에 관심이 있습니다.

저는 이미 특정 스레드에서 블록을 수행 할 수있는 NSThread 위에 카테고리를 만들었지 만보기 흉한 못생긴 해킹입니다.

답변

2

나는이에 대한 몇 가지 솔루션을 생각할 수 있습니다. 제한된 수의 메소드 만 존재하게 될 경우, 싱글 톤 인스턴스를 가져 와서 단일 스레드에서 메소드를 실행하는 각각에 대해 정적 래퍼를 생성 할 수 있습니다. 호출하는 스레드를 차단할지 여부를 결정하려면 메소드별로 선택할 수 있습니다.

이 더 우아하고, 마음에 오는 더 나은 확장 또 다른 옵션은, 이벤트 시스템을 사용하는 것입니다. 각 메소드에 대해 이벤트를 정의 할 수 있으며, 메소드가 메소드를 실행하려고하면 이벤트를 트리거합니다. 이벤트에서 데이터를 반환해야하는 경우 호출자가 메서드가 완료되었음을 알리는 이벤트에 등록하도록 할 수 있습니다.

최종 해결책은 forwardInvocation : 메서드를 사용하여 모든 메시지에 응답하고 단일 스레드에서 실제 싱글 톤 인스턴스의 선택기를 호출하는 프록시 개체를 만드는 것입니다. (자세한 내용은 Apple 설명서를 참조하십시오 : Forwarding). 이것은 가장 복잡하지만 아마 결국 가장 우아 할 것입니다. 이렇게하면 앞으로 추가 기능을 추가 할 필요없이 새로운 기능을 추가 할 수 있습니다.

+0

+1 프록시에 대해 - 이것이 길입니다. 당신이 제공하는 싱글 톤으로 작동 할 하나의 프록시 서브 클래스를 생성 할 수 있습니다. – Caleb