2014-10-06 37 views
5

AVSampleBufferDisplayLayer kullanarak H264 oynayan bir video kod çözücüm var ve hepsi aynı Görünüm Denetleyicide bir UICollectionViewController öğesini kaydırıncaya kadar iyi çalışıyor. Bu uygulamanın kilitlenmesine neden olan ana iş parçacığını engelliyor gibi görünüyor. Bu kodu dispatch_async kullanarak ayrı bir kuyruğa bir blokta koymayı denedim, ancak yine de dekoder üzerindeki diğer performans sorunları ile birlikte aynı engelleme problemine sahip oldum.UICollectionView bloklarını kilitleme ana iş parçacığı

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

Toplama Görünümü vb. Kaydırma gibi Kullanıcı Arabirimi eylemleri üzerinde bu göreve öncelik vermenin bir yolu var mı? Anlama eksikliği için özür dilerim IOS için oldukça yeni.

cevap

2

UICollectionView, ana iş parçacığındaki NSURLConnection için temsilci çağrılarını engelliyordu.

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]; 
değiştirildi: Bu sorunu çözüldü
İlgili konular