2012-04-05 5 views
1

나는 목표 C에서 아주 초보자 그리고 난이 다음과 같은 문제로 실행 :목표 - C의 재진입 함수

-(void) funcA 
{ 
    // array is NSMutableArray within class definition and initialised at alloc method 
    [array setLength:0]; 
    ...  
    // make search and delegate itself for callback to funcB 
} 

-(void) funcB:(NSData*) data 
{ 
    [array: appendData:data]; 
} 

(void) funcC 
{ 
     //Finished collecting data 
     //Signal caller for funcA that all data is received. 
} 

아이디어는 funcA에 의해 데이터를 여러 번 추가 서버에 연결하기 위해 호출된다 모든 데이터가 전송되면 funcB를 호출 한 다음 funcC를 호출합니다. 괜찮습니다.

문제는 funcA가 여러 번 호출되어 배열이 길이가 0으로 설정된다는 것입니다. 이전 요청을 처리하는 중입니다.

이제는 funcA에서 [NSLock lock]을 시도하고 funcC에서 [NSLock unlock]을 시도했지만 두 번째 요청에서 잠금 호출이 교착 상태가됩니다. 나는이 문제를 해결하기위한 또 다른 방법이 동기화라고 알고 있지만 함수 내에서만 블록을 보았습니다.

저는 보통 C로 프로그램하고 pthread_mutex를 사용할 것입니다. 그러나 저는 obj C에 모든 방법을 고수하고 싶습니다. 그들은 서로 다른 스레드라고 가정 합니다만, (교착 상태 때문에) 그렇지 않은 것처럼 보입니다.

이 문제를 어떻게 해결할 수 있습니까?

감사합니다. Indy

+0

이 메소드는 클래스가있는 클래스의 인스턴스 메소드이므로 인스턴스 변수 (또는 속성)가 될 것입니다. 호출자는 각 요청에 대해 새 객체를 만들 수 있습니까? 그것은 실제 질문에 대한 답이 아니지만, 우선 상황을 피하는 좀 더 OOP적인 방법 일 수 있습니다. –

+0

하나의 메소드를 잠그고 다른 메소드를 잠그면 불량한 설계가 필요한 경우 일반적으로 (예외가 있습니다). –

답변

3

난 당신이 방금 재진입 잠금 장치를 찾고 있다고 생각합니다. pthread_mutex은 기본적으로 재귀가 아니지만 옵션으로 표시됩니다. @synchronized은 재귀 적입니다. NSLock은 그렇지 않습니다.

필요한 경우 NSRecursiveLock을 사용할 수 있습니다.

+1

저스틴, 감사합니다! – Indy

+0

저스틴, 감사합니다! 그거였다. 그게 내가 필요한 전부 였어. 나는 문서에서 완전히 놓쳤다. – Indy

+0

@ user1315829 안녕하세요. – justin