2010-01-19 8 views
1

내 응용 프로그램에서 데이터베이스 쿼리를 수행하는 데 사용되는 NSOperation의 하위 클래스 인 'AsyncNetworkOperation'을 정의했습니다. 내 AsyncNetworkOperation 클래스의 AsyncNetworkOperation 시작 개체에 의해 사용되는 프로토콜이 있습니다보조 스레드가 아닌 주 스레드를 사용하여 대리자를 다시 호출 하시겠습니까?

@protocol AsyncNetworkOperationDelegate 
@optional - (void)operationAboutToFinish; 
@required - (void)operationFinishedWithData:(id)retrievedData; 
@required - (void)operationFinishedWithError:(NSError*)error; 
@end 

이 모두가 내가 돌아에 전화 했어 대리인이 UIAlertView를 표시하고자하는 경우를 제외하고 잘 작동을 시작 NSTimer를 사용하거나 보조 스레드가 수행하지 않아야하는 작업을하거나 추가 작업이 필요합니다.

여기 내 질문이 있습니다. 대리인에게 콜백 할 때 - [NSObject performSelectorOnMainThread :]를 통해해야합니까? 이렇게하면 대표자가 보조 또는 기본 스레드를 통해 다시 호출되는지 여부를 알지 않아도되므로 대리인이 제한없이 가장 직접적인 방법으로 기능을 구현할 수 있다는 부담을 덜어 줄 수 있습니다.

이 문제에 접근하는 표준 방법에 대해 궁금합니다.

감사합니다.

답변

0

AsyncNetworkOperation이 호출 된 것과 동일한 스레드에서 대리자 개체를 호출하는 것이 좋습니다. 비동기 작업이 주 스레드에서 처음 호출 된 경우 주 스레드에서 대리자를 호출해야합니다!

대리인이 UI를 업데이트 할 필요가없고 보조 스레드에서 호출하는 것이 좋습니다.

+0

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 내 최고의 추측 : 1) 비동기 작업이 시작되면 + [NSThread currentThread]를 호출하여 작업이 호출 된 스레드를 가져옵니다. 인스턴스 변수에 저장하십시오. 2) 작업이 완료되면 onThread : 매개 변수를 통해 저장된 스레드를 전달하여 - [NSObject performSelector : onThread : withObject : waitUntilDone :]을 사용하여 대리자를 호출합니다. 이게 맞는 것 같습니까? 아니면 이것을하는 더 깨끗한 방법이 있습니까? 감사. –

+0

@Greg, 당신이 실제로 스레드를 직접 만들고 있다면이 말이 맞다. 그렇지 않으면 필요하지 않을 수 있습니다. – notnoop

+0

NSOperation을 인스턴스화하고 NSOperationQueue에 추가하는 것입니다. 이것이 "스레드를 직접 만드는"것이 무슨 의미입니까? (나는 코코아 문서가 거의 NSOperation을 사용하는 것이 쓰래드를 만드는 방법이라는 것을 암시하는 것처럼 보이기 때문에 이것을 묻는다. NSOperationQueue가 나를 위해 쓰레드를 생성한다는 것이 진정한 방법을 이해할 때이다.) –

관련 문제