2012-07-06 24 views
7

Bu kadar uzun aynı iş parçacığı üzerindeBu Core Graphics kod parçacığı güvenli mi?

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
UIGraphicsEndImageContext(); 

dediğimiz gibi herhangi parçacığı üzerinde çizmek güvenli olduğunu biliyoruz.

Bu yöntemle bir görünümün ekran görüntüsünün alınması yaklaşık 300 ms sürer, bu da kötü değildir, ancak sıkı bir durumdayım, bu yüzden arka plan iş parçacığında yapmak istiyorum.

İşte yapıyorum: Söz konusu burada

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
     [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    }); 

tek şey ana iş parçacığı üzerinde yatıyor view vardır. Bir view.layer üzerinde renderInContext numaralı telefonu bir arka plan iş parçacığından aramak güvenli midir? Veya genel olarak, başka bir iş parçacığından bir UIKit nesnesinin salt okunur olması güvenli midir?

(Ve lütfen bana "UIKit iş parçacığı güvenli değil" cevabını vermeyin lütfen. Bunu zaten biliyoruz. Burada özel bir durum var (ve özel durumlar olmadığını söyleme.)

(kod yukarıdaki çalışıyor, ama bu sadece bir tesadüf olmadığından emin değilim.)

+0

Bu soruya kesin bir yanıt alacağınızı düşünmüyorum çünkü Apple'ın hiçbir yerinde Apple'ın "UIKit" dizgesi dışında bir şey belirtmediğini (listelenen istisnalar dışında) gösterecektir. Elde edeceğiniz şey, diğer insanlardan gelen görüşler ve deneyimlerdir, fakat dediğiniz gibi, yukarıdaki kodlar iyi çalışır, ancak kimin her zaman ve hatta bir başkasının size söyleyeceğini söylese bile, söyleyecekler mi? – Rog

+0

Bir iş parçacığının değiştirilmesi veya okunması için iş parçacığı kuralları uygulanır mı? – Snowman

+0

Ve eğer daha önce bir kopyasını kopyalıyorsam, eminim ki bu yöntem bu yeni kopyaya erişimi olan tek kişi olabilir mi? – Snowman

cevap

7

Çekirdek Grafik ve Core Animation düşük seviyeli API'ler olmak genellikle güvenli iş parçacığı vardır. Ancak, erişim ile ilgili aynı kurallar hala geçerlidir: Herhangi bir işe aynı anda birden fazla iş parçacığı tarafından erişilemez, aksi halde çizim başarısız olur ve uygulamanız kilitlenir. UIKit nesnelerinin dikkatli olmadığından (ama korkmuyorum), UIKit nesneleri sadece iş parçacığı güvenli değil, temelde arka plan ipliklerinde zaman bombalarını geçiyorlar ve iyi bir nedenden ötürü bir uçurumdan özel bir uçurumdan kolayca istifade edecekler. Ancak, UIImage bir CGImage sarıcısı olduğundan, yine çoğu çizim iş parçacığı için güvenlidir.

+0

Peki arka planda bir ekran görüntüsü almak için akıllı bir alternatif var mı? Bg iş parçacığında NSData'yı kullanma ve ana iş parçacığı üzerinde bir görüntü oluşturmak için bunu nasıl kullanabilirim? – Snowman

+0

Ekran arka planda mı? IOSurface olmadan, Apple şu anda Ekran Kaydedici sayesinde oldukça canlı bir şekilde farkına varılamıyor, ancak bu önemli değilse, [bakın] (http://stackoverflow.com/questions/11090184/how-does-the- iOS-uygulama ekran-kayıt-kayıt-ekran-olmayan--özel AP kullanarak /). – CodaFi

+0

Arka plan arka planda değil - arka plan dişi demek istiyorum .. – Snowman

İlgili konular