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.