2014-10-06 12 views
5

Mam dekoder wideo odtwarzający H264 za pomocą AVSampleBufferDisplayLayer i wszystko działa dobrze, dopóki nie przewińę UICollectionViewController na tym samym kontroler widoku. Wygląda na to, że blokujesz główny wątek powodujący awarię aplikacji. Próbowałem umieścić ten kod w bloku w oddzielnej kolejce przy użyciu dispatch_async, ale nadal mam ten sam problem z blokowaniem, a także dalsze problemy z wydajnością dekodera.Przewijanie UICollectionView blokuje główny wątek

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)"); 
         } 
        }); 

Czy istnieje sposób nadania temu zadaniu pierwszeństwa w stosunku do działań interfejsu użytkownika, takich jak przewijanie widoku kolekcji itp? Przepraszam za brak zrozumienia Jestem całkiem nowym użytkownikiem IOS.

Odpowiedz

2

Okazało się, że UICollectionView blokował delegowane wywołania NSURLConnection w głównym wątku. To rozwiązało problem:

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

zmieniły się

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                  delegate:self 
                startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] 
        forMode:NSRunLoopCommonModes]; 
[connection start]; 
Powiązane problemy