2010-11-20 16 views
5

UIScrollview'deki olay izleme, ana iş parçacığını engeller. Bazı animasyonları çalıştıran bir zamanlayıcıyı çalıştırmak için ana iş parçacığı kullanıyorum - sonuç olarak kaydırılabilir görünümdeki (yukarı veya aşağı sürükleme gibi) herhangi bir kullanıcı etkileşimi, animasyonun (ana runloopta çalışan) donmasına neden oluyor. Bunun etrafında bir yolu var mı?UIScrollView'daki olay izleme, ana iş parçacığını engeller. Herhangi bir düzeltme var mı?

I (CFRunLoopAddCommonMode vd) NSRunloop hakkında RTFM denedim ama olay öncelikleri ile müdahalesi inanmak beni lider, oldukça veciz var/iplik öncelikleri daha iyi önlenir. Herhangi bir fikir sahibi olan var mı?

+1

Yalnızca ana iş parçacığı UI şeyler yapabilir - yani geçerli olmaz iplik öncelikleri ile karıştırmasını. Merak ediyorum - NSTimers'ın ateş etmeyi bırakıp bırakmadığını mı yoksa zamanlayıcıların ateş etmesini mi, yoksa animasyonda yaptığınız değişiklikleri uygulamayı reddediyor musunuz? Animasyon * UIScrollView'a * veya scrollview içinde * mi * mi? Yani, scrollview kaydırmanın değişmeye çalıştığı aynı şeyi canlandırmaya ve değiştirmeye mi çalışıyorsunuz? (Görünüm görünümleri, vb.)? – Brad

+0

Teşekkür Brad - Yapacak (muhtemelen tehlikeli) umduğu böylelikle eventTracking runloop ile eş zamanlı olarak çalıştırmaya devam etmek sağlayan ana runloop için eventTracking modunu eklemek oldu. Engellenen animasyon, aslında kaydırma görünümünü içeren görünümden tamamen farklı bir görünümde gerçekleştiriliyor. Diğer sorunuzu cevaplamak için NSTimer tamamen ateş etmeyi bırakır. UIScrollView'da (ilgisiz) kullanıcı olaylarını izleme öncelikli iş tarafından tamamen engellenmiş görünüyor. –

cevap

16

yerine zamanlayıcı nesnesi oluşturmak ve bunun gibi el ile zamanlama, NSTimer statik kurucular birini kullanarak 'sizin gibi sesler, özellikle de elbette oldukça farklı olacaktır Yinelenen bir zamanlayıcı kullanıyor. Bence temel fikri görebiliyorsun.

çalıştırma döngü Kaydırırken

yürütülmesini "varsayılan mod" görevleri engelleyen bir moduna girer. Statik NSTimer, tüm programlamayı varsayılan moda ayarlar; bu nedenle, kaydırma yaparken yanmıyorlar. Zamanlayıcıyı manuel olarak programlamak, modu belirlemenizi sağlar ve NSRunLoopCommonModes, kaydırma ile kullanılan çalışma modunu içerir.

+0

Parlak! Kullanıyordum: \t [[NSRunLoop mainRunLoop] addTimer: loopTimer forMode: [NSRunLoop currentMode]]; hala engellendi. Fikriniz mükemmel çalışıyor. –

+0

Bir trilyona teşekkürler! Bu düzeltme, tembel yükleme tablomun kullanılabilirliğini önemli ölçüde artırır. – Nailer

0

Bir fikir, ayrı bir iş parçacığı üzerinde zamanlayıcı koşmak sahip olmaktır. Zamanlayıcı patladığında, ana iş parçacığı üzerinde çalışması gereken şey var.

Düzenleme:

Ah evet, ben tamamen nasıl UIScrollView bloklar hemen hemen her şeyi unuttum. Başka bir fikir (çok çirkin olsa da), zamanlayıcının UIScrollView öğesinin temsilci yöntemleri (örn. -scrollviewDidScroll, vb.) Sırasında tetiklenip tetiklenmediğini kontrol etmektir. Bu gerçekten bir kesmek, ama temelde kaydırma sırasında herhangi bir kodu çalıştırmak için bildiğim tek yolu var. initWithFireDate için

NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:delayInSeconds] interval:0 target:yourObject selector:yourSelector userInfo:nil repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
[timer release]; 

Sizin paramters:

+0

Teşekkürler, evet aslında animasyon zamanlayıcımı ana iş parçacığımda çalıştırıyorum. Bu kullanıcı olayların takibi ana iş parçacığı daha yüksek bir öncelik sırasında çalışan kamera arkası gibi görünüyor, bu nedenle (kaydırma gibi) sürekli bir şey olduğunda, uzun süre engeller ana iş parçacığı ... –

+0

@Andy Milburn: Başka bir fikir için düzenleme konusuna bakın. –

İlgili konular