2015-01-15 1 views
1

안녕하세요 iOS 테스트에서이 QCM을 수행했습니다. 내 선택은 B.이고 틀렸어. 누군가가 나를 이해하는 데 도움이되기를 바랍니다. 미리 감사드립니다.이 NSOperation 인스턴스에서 NSURLConnection의 대리자 프로토콜 메서드를 호출하는 방법은 무엇입니까?

여기에 질문 : NSURLConnection 인스턴스가 만들어지고 동시 NSOperation의 "시작"메서드 구현 내부에서 시작되었습니다.

이 NSOperation 인스턴스에서 NSURLConnection의 대리자 프로토콜 메서드 호출을 변경하려면 어떻게해야합니까? 세 답이있다

-(void)start{ 
    ... 
    _connection = [[NSURLConnection alloc] initWithRequest: request delegate:self  startImmediately:NO]; 
    [_connection scheduleInRunloop: [NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
    [_connection start]; 
    ... } 
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
    { 
    NSLog(@"Called"); } 

가 제공 A는 :

B YES로 설정 startImmediately : (dispatch_get_current_queue을()^{}) dispatch_async 바꿈이 코드;

C : didReceiveResponse가 호출됩니다.

+0

코드 스 니펫이 정상적으로 보입니다. (분명히 NSOperation 하위 클래스에 훨씬 더 많은 것이 있지만 구현 한 것으로 가정하고 있습니다. isAsynchronous/isConcurrent'는'TRUE'를 리턴합니까?) 이것은 NSURLConnection'을 생성하는 유효한 방법입니다. 'NSOperation' 하위 클래스에 있습니다. 'startImmediately'를'YES'로 설정해서는 안됩니다. 'dispatch_async'를 할 필요도 없습니다. 제공된 코드 조각에 문제가 있다고 말하는 것입니까? 문제가 무엇인지는 분명하지 않습니다. – Rob

+0

@Rob 질문은 "NSUperation이 큐에 추가 될 때'didReceiveResponse :'가'NSURLConnectionDelegate' 메소드가 자동으로 호출되도록하기 위해해야 ​​할 일이 무엇인지를 설명하는 라인이 있다고 생각합니다. 유효한 응답. 그리고 당신이 말하는 것에 따라, 나는 대답이 C가 될 것이라고 생각한다. 코드는 괜찮다 ...'start'는 이것을 작업 큐에 추가 할 때 호출된다. NSURLConnection을 설정하고, 응답을 받으면 대리인을 호출합니다. –

+0

@LouisTur 동의했습니다. 예, "C"라고 말하고 있습니다. 나는 왜 그가 질문하는 이유를 알아 내려고 노력하고 있습니다. 왜냐하면 나는 모든 것이 순조롭게 진행되고 있는지를 묻지 않을 것이라고 생각하기 때문이다. 나는 실제로 어떤 이유로 호출 된 그의 대리자 메소드를 보지 않고 있으며 가능한 해결책으로 파악하고 있다고 가정하고있다. 그렇다면 문제는 분명히있다. 그의 코드에서 다른 곳으로. M 'isAsynchronous' /'isConcurrent'에서'TRUE'를 반환하지 않는 문제가 있습니다. 아니면'isFinished'에서 잘못된 값을 잘못 반환하고 있습니다. 또는 이전 작업에서 KVN을 필요로하지 않습니다. 또는 ... – Rob

답변

0

이 코드 샘플에는 변경이 필요하지 않습니다 (옵션 C).

startImmediately ~ YES (옵션 A)을 설정하면 적절한 실행 루프에서 예약하기 전에 연결을 시작하기 만하면 문제가 발생할 수 있습니다.

이론적으로 주 스레드 (옵션 B)에 대한 연결 생성을 디스패치 할 수 있으므로 기본 실행 루프에서 수동으로 스케쥴 할 필요가 없습니다. 그러나 코드 샘플 (수동 실행을 기본 실행 루프에서 수동으로 예약)은 동일한 작업을 수행하며보다 일반적인 패턴입니다.

결론 아래 기존 코드 샘플은 정상입니다.