2011-08-26 7 views
1

Cocoa/Objective C에서 정적 클래스 메서드는 스레드로부터 안전합니까? 관련된 커스텀 URL 요청을하기위한 클래스를 정의하고 있는데, 이것은 여러 스레드에서 호출하고 싶습니다. 이 전 클래스가 있다고 가정 해 봅시다 :코코아/목표 C : 메서드 및 스레드 안전

@interface URLConnector : NSObject { 
} 
+(Response *)getData:(NSString *)category; 
+(Response *)put:(NSString *)category content:(NSData *)content; 
@end 

각 방법은, NSMutableURLRequest 정의를 호출하고, NSRunLoop 사용 runUntilDate를 : 응답을 기다리는. 또한 NSMutableRequests의 콜백을 처리하기 위해 URLConnectorDelegate라는 다른 클래스의 인스턴스를 만들고 반환하기 전에 해제합니다. (참고 :이 코드는 URL 요청을하기 위해 널리 사용되는 공용 라이브러리를 기반으로합니다.)

이 접근 방식에 대해 좋아하는 점은 모든 스레드를 단순하게 유지하고 모든 사용자 지정 서버 관련 코드를 한 곳에서 처리한다는 것입니다. 스레드는 단일 함수 호출로 URL 요청을 실행할 수 있습니다.

모든 스레드가 동시에 이러한 정적 함수를 사용하여 동시 호출을 할 수 있습니까 (즉, 정적 objective-c 메소드는 본래 스레드 안전)?

답변

2

배경 스레드가 될 것이라는 것을 알고 계시다면 +[NSURLConnection sendSynchronousRequest:returningResponse:error:]을 사용하지 마시고 끝내시겠습니까?

런 루프가 필요하지 않습니다. 그리고 로컬 변수와 인수 만 사용하면 스레드 안전성이 거의 보장되지 않습니다.

그렇지 않으면 스레드 유형에 관계없이 스레드 안전은 사용자에 달려 있습니다.

클래스 메서드는 인스턴스 메서드보다 스레드로부터 안전하지 않습니다. 실제로 두 가지 방법 모두 실행 시간에 따라 똑같이 진행됩니다. 클래스는 실제로 메타 클래스의 객체 인스턴스이므로 클래스 메소드에 대한 호출은 객체에 대한 일반적인 메소드 호출입니다.

+0

그래서 로컬 변수에 관한 한이 두 종류의 메소드 모두 스레드로부터 안전합니까? 예를 들어 로컬 변수를 반복 할 경우 (int i = 0; i <20; i ++) - 메서드에서 두 스레드가 동시에 메서드를 실행하는 경우 충돌이 발생합니까? – Colin

+1

@Colin : 스택의 모든 로컬 변수는 스레드 로컬이므로 안전합니다. 따라서 '정적'으로 표시된 변수를 사용하지 않거나 다른 방법으로 메소드의 범위 밖에서 살려두면 안전합니다. – PeyloW

0

다양한 스레드에서 스톰프 할 수있는 인스턴스 변수를 사용하지 않고 클래스 메서드에서 모든 처리를 수행 할 수있는 방법이 없습니다. 나는 그 메소드들을 일반적인 인스턴스 메소드로 만들고 각 쓰레드에 인스턴스를 할당해야한다고 생각한다. 나는 왜 당신이 처음에 그것들을 클래스 메소드로 만드는 것을 고려할 지 모르겠습니다.

+0

호출 할 때마다 정적 메서드는 응답을 처리 할 수있는 새 연결 위임 개체를 만듭니다. 나는 원래 게시물을 편집 할 것이다. – Colin

3

클래스 메서드가 스레드 안전성에 영향을 미치지 않습니다. 중요한 것은 데이터 액세스 방법입니다. 스레드로부터 안전하지 않은 방식으로 데이터에 액세스하는 경우이 메서드는 스레드로부터 안전하지 않습니다.

자신의 실행 루프를 펌핑하기보다는 기본 실행 루프에 NSURLConnection을 부착하면 URL 로딩 시스템이 설계된 것처럼 스스로를 관리합니다. NSURLConnection scheduleInRunLoop:forMode:

+0

필자는이 방법을 사용하려는 이유에 대한 약간의 정보로 질문을 편집했습니다. 나는이 주제를 조금씩 연구했고 일부 사람들은 자신의 실행 루프를 이런 방식으로 성공적으로 실행한다고보고하지만 NSURLConnection 자체와 관련된 문제가 발생할 수 있습니다. – Colin

0

현재 스레드의 실행 루프 (즉, 클래스 메소드를 호출하는 모든 스레드)에 NSRunLoop:runUntilDate:을 호출한다고 가정하면이 클래스 메소드에서 수정되는 전역 변수/정적 변수가 없다면 스레드 안전해야한다고 생각합니다.