2014-10-06 63 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];