2013-04-10 16 views
19

iOS geliştirmede oldukça yeniyim, ancak daha karmaşık kavramların bazılarını anlamaya başladım. Şu anda video çekmek için bir AVCam uygulayan bir uygulama var. AVCam ayrı bir iş parçacığı üzerinde oluşturulur, ancak ana xib dosyamdaki bir görünümü kullanır. Kamera çekimi tamamlandığında, ViewController sınıfımda tam bir işlevi çağırır. Tam işlev içinde, UI'yi ve birkaç NSLog'u güncelleyen bir dizi başka işlevi çağırıyorum. Her şey iyi çalışıyor gibi görünüyor, hemen konsolda günlükleri görüyorum, ancak UI güncellemek için 3 saniye sürüyor. Rahatsız edici kodu bulmak için enstrümanlar kullanmayı denedim, ancak onu bulamıyorum. Kullanıcı arayüzü tarafından neyin engellendiğini belirlemenin başka bir yolu var mı?iOS UI'nin neden engellendiğini belirleme

Kayıt tamamlandığında çağrılan kod İşte;

-(void)movieRecordingCompleted{ 
     [HUD hide:YES]; 
     NSLog(@"movieRecordingCompleted"); 
     [self showModalViewController]; 
     NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mov"]; 
     NSLog(@"pathToMovie: %@", pathToMovie); 
     pathToTreatedVid = pathToMovie; 
     NSLog(@"File Save Called"); 
     UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, NULL, NULL); 
} 

Herşey hemen kaydedilir, ancak ilerleme HUD ve modal görünümü kontrolörü yaklaşık 2 için tetiklemez - 5 saniye, bu çok tuhaf.

Aşağıda, iş parçacıklarının önceki ve sonraki durumları (donuk hale geldiğinde donmuş olduğu zaman). enter image description here enter image description here

+0

Lütfen UI'yi güncellediğiniz bazı kodları gösterin. –

cevap

-7

Bu fonksiyonu kullanarak Seviyorum

"x", o saniye bu numara için çalıştırmak her neyse iplik saniye ... sadece engeller sayısıdır
sleep(x); 

. UI'niz donarsa, ana iş parçacığını engellediğinizi ve böylece kodun ana iş parçacığında çalıştırıldığını biliyorsunuz (bunu ister istemez veya etmesin). Bu aramayı kodunuzdaki farklı yerlere yerleştirmeyi deneyin ve neler olup bittiğini teşhis etmenize yardımcı olmalıdır. Umarım yardımcı olur.

+1

Bir yöntemin tam olarak hangi iş parçacığı üzerinde çalıştırıldığını öğrenebilirsiniz. Xcode, kesme noktasını işaret ettiğinde sol paneldeki ipliği vurgulayacaktır. – Ash

7

Uygulamanızı nelerin engellediğini öğrenmek için Time Profiler kullanabilirsiniz. Program yürütme Pause için

+0

Zaman profesörü kullanmayı denedim, iş yaptığım zaman, sürecimin yeni bir konuya dönüştüğünü görüyorum ve bu tehdidin çalışma süresi artıyor. Süreç "tamamlandı" yani tam işlevimin çağrıldığını gördüğümde, çalışma süresi durma artar ... ama ana işlev artmaya başlamaz. Uygulama sadece bazı sebeplerden dolayı donmuş bir şekilde donmuş gibi oluyor – user379468

38

deneyin

( Xcode alt panelde bunun için bir düğme, üçüncü bir tane)

Pause

  • Sonra
  • bul, sol panelde (Navigator panel) bakmak Debug Navigator

Debug Navigator

  • main işlevli iş parçacığını bul ve bu iş parçasındaki yöntemlerle mb'yi bulabilirsin, UI'nizi güncellemek için çok uzun süren şey. Şu anda çalışan yöntem genellikle en üstte siyah olanıdır (gri renkle obj-c iç yöntemleri listelenmiştir).

main

+1

Bu yaklaşım yararlı sonuçlar vermeden önce birkaç kez denenebilir, bu yüzden sabırlı olduğunuzdan emin olun. – Tim

+0

Bu yaklaşımı denedim, UI "donmuş" olduğunda bir dizi iş parçacığı görüyorum (sıraya göre sıraladığımda). Ana (com.apple.main) biri RemoteClientNotifyQueue ve bir tane com.apple.libdispatch-manager denir fakat bu bilgilerin bana nasıl yardımcı olduğunu gerçekten bilmiyorum – user379468

+0

@Ossir I uygulamayı geçici olarak dondurulmuş halde durdurdu ve sonra duyarlı hale geldikten sonra, fark 3 iş parçacığı diker, tam olarak ne yapıyorlar hala benim için bir gizem. (bkz. resim ekli) – user379468

3

profile modunda App çalıştırarak Instruments Sistem İz aracını kullanabilirsiniz. Ardından, sistemdeki tüm iş parçacıklarının ayrıntılı bir çalışmasını, iş parçacığının içinden geçtiği her zamanlama olayında yığın izleri ile birlikte alırsınız.

2016 WWDC System Trace in Depth'dan engellenen bir iş parçacığı sorununu gidermek için size yardımcı olacak harika bir video var.

Bu aralıklarla CPU nelerin çalıştığını örnekler alınarak kapalı dayalı bu alet işler, çünkü Zaman Profiler enstrüman daha iyidir. Ancak, iş parçacığınız engellendiyse, CPU üzerinde çalışmıyor, yani - örneklenmeyecek. Ana parçanızın bir saniyeliğine engellenmiş olabilir, ancak Zaman Profiler'de görünmez.

İlgili konular