2014-10-06 1 views
5

나는 AVSampleBufferDisplayLayer를 사용하여 H264를 재생하는 비디오 디코더를 가지고 있으며 동일한 View Controller에서 UICollectionViewController를 스크롤 할 때까지 모든 것이 잘 작동합니다. 앱이 다운되는 주요 스레드가 차단 된 것으로 보입니다. dispatch_async를 사용하여 별도의 큐에있는이 코드를 블록에 넣으려고 시도했지만 디코더의 성능 문제와 함께 여전히 동일한 차단 문제가 있습니다.스크롤 UICollectionView 메인 스레드

dispatch_async(sampleQueue, ^{ 

         [sampleBufferQueue addObject:(__bridge id)(sampleBuffer)]; 

         if ([avLayer isReadyForMoreMediaData]) { 
          CMSampleBufferRef buffer = (__bridge CMSampleBufferRef)([sampleBufferQueue objectAtIndex:0]); 
          [sampleBufferQueue removeObjectAtIndex:0]; 
          [avLayer enqueueSampleBuffer:buffer]; 
          buffer = NULL; 

          NSLog(@"I Frame"); 
          [avLayer setNeedsDisplay]; 
          while ([sampleBufferQueue count] > 0 && [avLayer isReadyForMoreMediaData]) { 

           CMSampleBufferRef buffer = (__bridge CMSampleBufferRef)([sampleBufferQueue objectAtIndex:0]); 
           [sampleBufferQueue removeObjectAtIndex:0]; 
           [avLayer enqueueSampleBuffer:buffer]; 
           buffer = NULL; 
           NSLog(@"I Frame from buffer"); 
           [avLayer setNeedsDisplay]; 
          } 
         } 
         else { 
          NSLog(@"AVlayer Not Accepting Data (I)"); 
         } 
        }); 

이 작업에 콜렉션 뷰를 스크롤하는 것과 같은 사용자 인터페이스 동작보다 우선 순위를 부여 할 수있는 방법이 있습니까? 이해 부족에 대한 사과 나는 IOS에 합리적으로 새로운입니다.

답변

2

UICollectionView가 주 스레드의 NSURLConnection에 대한 대리자 호출을 차단하고있는 것으로 나타났습니다.

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                  delegate:self]; 

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                  delegate:self 
                startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] 
        forMode:NSRunLoopCommonModes]; 
[connection start]; 
변경 :이 문제를 해결