2015-04-28 16 views
7

Video galerisi oluşturmaya çalışıyorum.AVAssetImageGenerator performans sorunu

Videoları görüntülemek için UICollectionView numaralı telefonu kullanıyorum. Her UICollectionViewCell, video küçük resimli bir arka plana sahiptir. Ben generateCGImagesAsynchronouslyForTimes uyumsuz tamamen çalışmaz fark etmiş

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 

AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 

generator.appliesPreferredTrackTransform = YES; 

CMTime time = CMTimeMakeWithSeconds(0,15); 

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime timeRequested, CGImageRef image, CMTime timeActual, AVAssetImageGeneratorResult result, NSError *error) 
{ 
    NSLog(@"handler^()"); 

    if (result == AVAssetImageGeneratorSucceeded) 
    { 
     thumbnail = [UIImage imageWithCGImage: image]; 

     success(thumbnail); 
    } 

    else 
    { 
     failure(error); 
    } 
}; 

CGSize maximumSize = CGSizeMake(CLIPBOARD_COLLECTION_VIEW_CELL_WIDTH, CLIPBOARD_COLLECTION_VIEW_CELL_HEIGHT); 

generator.maximumSize = maximumSize; 

NSLog(@"generateCGImagesAsynchronouslyForTimes:"); 
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler]; 

: Ben mantığı ile bir yöntemi kullanıyorum bir video küçük oluşturmak için. Bu yöntem çağrıları arasında bir zaman aralığı var. Bu tablo görünümü hücreleri yüklerken büyük bir gecikme neden olur. [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler] numaralı hattı yorumlarsam, görünür bir gecikme (veya resim) yoktur.

Bu performans sorununu nasıl çözebilirim?

+0

Tam olarak ne gecikme olduğunu belirtebilir misiniz? Kaydırma performansı muzdarip mi, yoksa istek ile işleyici arandığında uzun zaman alıyor mu? Zaman Profiler aracının sonuçlarını ekleyebilir misiniz? – jszumski

+0

"generateCGImagesAsynchronouslyForTimes" çağrıları arasında zaman boşlukları var ... –

+0

@TomKortney Bir çözüm buldunuz mu? Aynı sorunla karşılaşma – Sam

cevap

3

AVAssetImageGeneratorCompletionHandler blok ana parçacığında çağrılacak garanti: bloklar AV Vakfı çağrıları, anahtar değeri gözlemci AV Hazırlık

belirtme çizgileri ile

Eşzamanlı Programlama ve bildirim işleyicileri - herhangi bir özel iş parçacığı veya sıraya göre yapılması garanti edilmez. Bunun yerine, AV Foundation bu işleyicileri iç görevlerini gerçekleştirdiği iş parçacıkları veya sıralar üzerine çağırır. Bir işleyicinin çalıştırıldığı iş parçacığının veya sıranın gerçekleştirmek istediğiniz görevler için uygun olup olmadığını sınamanız gerekir. Eğer değilse (örneğin, kullanıcı arayüzünü güncellemek istiyorsanız ve bilgi notu ana iş parçacığında değilse), görevlerin yürütülmesini, tanıdığınız güvenli bir iş parçacığına veya sıraya yönlendirmeli ya da amaç.

dispatch_async ile success ve failure arayarak sorunu çözer mi?

dispatch_async(dispatch_get_main_queue(), ^{ 
    if (success) { 
     success(); 
    } 
)}; 
+1

'dispatch_async' ekleme bu performans sorunu çözmez. Ben hala dispatch_asinc ile bile gecikme yaşıyorum. –

0

bir NSBlockOperation en uygun olanı ayarlı altında yatan kuyruğunda bir NSOperationQueue eklenen içinde fonksiyonun kapsülleme olan başka bir iş parçacığı üzere bunlardan birini asenkron görüntü oluşturma isteğini yönlendirmek için birkaç yol vardır uygulamanız için.

En uygun kuyruğun, bilmeniz gerekmedikçe, sadece birkaç seçenek olduğundan, tahmin edilmesi nispeten kolay olmalıdır.