1

당신이 도와 줄 수 있기를 바랍니다. :)데이터를 파싱하는 동안 UI를 그리는 NSOperation?

주 스레드에서 NSOperation을 만들어 대기열에 추가합니다. NSURLConnection을 사용하여 데이터 서버에 연결하고 receivedData를 저장하고 파싱하는 작업은 무엇입니까?

- (void)start 
{ 
    NSLog(@"opeartion for <%@> started.", [cmd description]); 

    [self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url]; 

    [request setHTTPMethod:@"POST"]; 
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", m_BOUNDARY] forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:_postData]; 

    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (_connection == nil) 
     [self finish]; 
} 

Operation.m는이 NSURL 위임 방법에 난 그냥 서버로부터받은 데이터를 분석합니다. 데이터에서 Operation.m

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    [self parseItems]; 
} 

, 내가 예를 들어, 같은 항목을 찾을 수 있습니다, 내가 도착하는 동안을 그리기 위해 메인 스레드로 보내 screenItem, CellItem, TextItem.

- (void) parseItems 
{ 
    while ([_data length] > 0) 
    { 
     NSInteger type = [self _readByte]; 

     switch (type) 
     { 
      case SCREEN: 
      { 
       [self _send: [self _readScreen]]; 
       break; 
      } 
      case CELL: 
      { 
       [self _send: [self _readCell]]; 
       break; 
      } 

      // ... A lot of different items 
     } 
    } 
} 

- (void)_send:(CItem*)_item 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"newItem" object:_item]; 
} 

그런

Operation.m : 메인 스레드에 항목을 보내는이 사용

(AN itemTable가 도착하면 나는 jQuery과 만들거나 itemWeb가 도착하면 내가있는 UIWebView를 만들 수) 알림 수신기 :

AppDelegate.m

- (void) _newItemArrived:(NSNotification *) notification 
{ 
    [self performSelectorOnMainThread:@selector(processItem:) withObject:[notification object] waitUntilDone:NO]; 
} 

제 문제는 NSOperation이 완료 될 때까지 UI가 그려지지 않는다는 것입니다. 나는 다른 스레드 인 NSOpertion이 주 스레드를 차단하지 않을 것이라고 생각했지만 그 일은 일어나고 있다고 생각합니다.

이 호에 대한 몇 가지 팁이 있습니까?

읽어 주셔서 감사합니다.

+0

방금 ​​관련 질문에 답변했습니다. http://stackoverflow.com/questions/11158294/nsoperation-mainqueue-issue/13477136#13477136. 희망이 도움이됩니다. –

답변

0

NSOperationQueue을 사용하고 있습니까? 다른 스레드에서 비동기 적으로 실행되는 NSOperation에서 알림으로 UI를 업데이트하는 방법의 간단한 예를 들어 질문 NSOperation blocks UI painting?

체크 아웃 this answer.

업데이트

  1. 있는 NSURLConnection 대리자와 자체 비동기 접속을 지원한다. 이걸 사용해야합니다. 특정 문제가있는 경우 해당 문제를 설명해야합니다.
  2. ASIHTTPRequest 라이브러리를 확인하십시오.
  3. 이 방법을 사용하려면 NSURLConnection을 동 기적으로 실행 해보십시오 (클래스 메서드 sendSynchronousRequest:returningResponse:error: 사용). 연결이 백그라운드 스레드에 있기 때문에 응용 프로그램이 계속 응답합니다. 그러나 모든 데이터가 수신 될 때까지는 업데이트 할 수 없습니다.
+0

답변 해 주셔서 감사합니다! 예, NSOperationQueue를 사용하고 있습니다. 나는 그 대답을 읽었으며, 지금하고있는 일이지만, 그다지 효과가 없습니다. 나는 무엇인가 놓치고 있어야하고, 나는 그것을 볼 수 없다. : S – jota

+0

왜 작업에서 시작 메소드를 강제로 주 스레드에서 실행 하시겠습니까? – gerry3

+0

또한 NSURLConnection을 사용하는 방법은 비동기 다운로드 용이므로 별도의 스레드가 필요하지 않습니다. 델리게이트 메서드를 구현하면됩니다. – gerry3

0

그래서 난이 꽤 오래된 질문입니다 알고 있지만 저도 같은 문제로 실행 및 문서와 블로그를 통해가는 시간 후에 나는 당신의 NSOperation 퍼팅 빔 Haanstra http://www.depl0y.com/?p=345

에서이 게시물에 좋은 해결책을 발견 무한 루프에서 데이터를 얻을 때까지 트릭을해야합니다!

관련 문제