2015-01-09 5 views
1

해당 클래스에 NSOperation 클래스를 생성했습니다. NSURLConnection을 호출하여 일부 데이터를 가져옵니다. NSOperation 클래스 내부에서 메인 스레드를 사용하여 NSURLConnection으로 전화를 겁니다. NSURLConnection의 대리자가 NSOperation 클래스 개체로 설정되어 있습니다. NSURLConnection의 전화가 메인 스레드에 있습니다. 동일한 조작 스레드를 사용하여이 데이터를 처리해야합니다. 나는 이것을 어떻게 달성합니까 ??NSOperation + NSURLConnection

@implementation ModelCreationSearchOperation { 
    int try; 
} 

- (BOOL)isConcurrent 
{ 
    return YES; 
} 

- (void)start 
{ 
    [self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (self.isCancelled) { 
      [self finish]; 
      return; 
     } 
    }); 

    [self fetchData]; 
} 

-(void)fetchData { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    }); 
} 

- (void)finish 
{ 
    [self willChangeValueForKey:@"isExecuting"]; 
    [self willChangeValueForKey:@"isFinished"]; 

    _isExecuting = NO; 
    _isFinished = YES; 

    [self didChangeValueForKey:@"isExecuting"]; 
    [self didChangeValueForKey:@"isFinished"]; 

    [self cancel]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    //Main thread 
    //Want to perform parsing of response data on operation thread .... 
} 
+0

에 나와 있습니다. 한편, 당신의 질문과는 무관하게, isCancelled 논리는 적절하지 않습니다. 'isExecuting'을 설정하고'fetchData'를 호출하기 전에 확인해야합니다. 메인 큐로 전달하는 것은 아무런 소용이 없습니다. (또한'return'이 페치가 일어나지 않도록해야하기 때문에 역효과가 있습니다 만, 바로 지금 당신은 디스패치에서 돌아오고 있지만 isExecuting과' op가 취소되었는지 여부에 관계없이 fetchData가 발생합니다. 이는 의도 한 것과 다릅니다. 또한 iOS 7을 시작하면'isAsynchronous'도 구현해야합니다. – Rob

+0

오 예 ... 대단한 잡다한 .. 감사 ... –

답변

1

"조작 스레드에서 응답 데이터 구문 분석을 수행하려고합니다."라고 말했습니까? 정말로 작업 스레드에서 실행해야합니까, 아니면 기본 스레드에서 꺼내기 만하면됩니까? 작업 대기열에는 반드시 하나의 전용 스레드가있을 필요가 없으므로 질문이 이해가되지 않습니다. (디스패치 대기열과 작업 대기열의 아름다움 중 하나인데, 우리를 위해 스레드를 관리하므로 일반적으로 이러한 세부 사항에 관여 할 필요가 없습니다.)

connectionDidFinishLoading의 코드를 실행하려면 백그라운드 스레드 (예를 들어,이 델리게이트 메소드에서 예외적으로 느린 작업을하는 경우)를 백그라운드 스레드 (글로벌 큐를 사용할 수 있음)로 보내면됩니다. 이 connectionDidFinishLoading 호출에 대해 직렬 대기열을 원할 경우, 직렬 대기열을 작성하여이 코드를 해당 대기열로 보내십시오. 하지만 너무 계산적이지 않은 (예 : JSON 또는 그와 유사한 구문 분석) 것이 아니라면 문제없이 주 스레드에서 실행되도록 할 수 있습니다.

정말로 원하는 경우 NSURLConnection 대리인 통화를위한 전용 스레드를 만들고 해당 스레드에서 연결을 예약 할 수 있지만 일반적으로 잔인합니다. 그러나이 구현의 예를 보려면 AFNetworking 코드를 참조하십시오. 이것은 How do I start an Asychronous NSURLConnection inside an NSOperation?

+0

nsoperation을 사용하여 nsurlconnection을 호출해야합니까 ?? Nsurl 연결 자체가 백그라운드 스레드에서 실행됩니다. 실제 사용 하시겠습니까 ?? .. urlconnection delegate ..thanks에 대한 특별한 스레드를 만드는 방법에 대한 자세한 내용을 제공 할 수 있다면 좋을 것입니다 ... –

+0

"필요합니다. nsoperation을 사용하여 nsurlconnection을 호출합니까? " 아니, 물론 아니야. 'NSOperation'의 이점을 누리고 싶다면 (예를 들어, 각 요청에 대해 포함 된 객체가 좋고 큐의 동시성 제약, 종속성 등을 제한해야합니다.) 필요하지 않다면, 'NSOperation'과'NSOperationQueue'를 사용하십시오. 당신은 'NSOperation'에 포장하기를 원한다고 말하는 사람입니다. 그래서 당신은 이유가 있다고 가정합니다. (개인적으로는 늘 그렇지만 많은 사람들이하지는 않습니다.) – Rob

+0

NSURLConnection 전용 스레드를 만드는 것에 관해서는 그렇게 할 수 있습니다 만, _why? _ 당신이 지적했듯이, 그것을 시작한 스레드에 상관없이 이미 비동기 적으로 실행됩니다 , 그래서 당신이 주 스레드를 차단하지 않는 것이 좋다면 (그리고 어쨌든 그렇게해야한다), 문제가 아니다. 그러나 필요한 경우 http://stackoverflow.com/a/17427268/1271826을 참조하십시오. 하지만 개인적으로, 나는 요즘 메인 대기열을 사용합니다. – Rob