2014-10-06 18 views
5

Ho un decoder video che riproduce H264 utilizzando AVSampleBufferDisplayLayer e tutto funziona bene finché non faccio scorrere un UICollectionViewController sullo stesso controller di visualizzazione. Sembra che blocchi il thread principale causando l'arresto anomalo dell'app. Ho provato a inserire questo codice in un blocco su una coda separata utilizzando dispatch_async, ma ho ancora lo stesso problema di blocco insieme a ulteriori problemi di prestazioni sul decoder.Scrolling UICollectionView blocks main thread

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

C'è un modo per assegnare a questa attività priorità su azioni dell'interfaccia utente come lo scorrimento di una vista raccolta ecc.? Scuse per mancanza di comprensione Sono ragionevolmente nuovo per IOS.

risposta

2

Risulta che UICollectionView ha bloccato le chiamate delegate per NSURLConnection sul thread principale. Ciò ha risolto il problema:

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

cambiata in

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                  delegate:self 
                startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] 
        forMode:NSRunLoopCommonModes]; 
[connection start]; 
Problemi correlati