2014-10-06 64 views
5

我有一个使用AVSampleBufferDisplayLayer播放H264的视频解码器,并且一直运行良好,直到我在相同的视图控制器上滚动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)"); 
         } 
        }); 

有没有办法让这个任务优先于滚动Collection View等用户界面动作?对于缺乏理解的道歉我对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];