2011-10-27 6 views
5

yürütmüyor, herhangi düşünceler veya öneriler büyük takdir.performSelectorOnMainThread bu saçımı yırtarak

ben çocuk iplikle kendi üzerine performSelectorOnMainThread:withObject:waitUntilDone: çağıran bir nesne var. Bu, zamanın% 95'inde çalışıyor. bir zamanlar iOS betalarına beri bir süre ve şimdi serbest bırakılması halinde her bir cihaz Ben "başarısız nerede bir aygıt durumuna geçmesine yapamıyorum, o düşmezse, performSelectorOnMainThread:withObject:waitUntilDone: aramaları ... Hiçbir hata mesajı yürütmek için reddedecektir orada olduğunu bir kez ben de silip uygulamayı yeniden yükleyin veya çıkmak için zorlamak, o zaman konum hizmetleri indirimi var ayarlamak, ardından tekrar başlatmak, o zaman normale döndü tekrar konum hizmetlerini var yeniden ayarlamak kadar "ama başarısız olmaya devam ediyor. .. aygıtı yeniden başlatmak bunu düzeltmez. İlk önce silmeden yeniden yükleme, düzeltmez. Çok garip .... Çoğu zaman çalıştığını biliyorum çünkü çoğu cihazda problem yok, ancak bazı cihazlar düzenli olarak başarısız oluyor (her 3 veya 4 günde bir). Özellikle performSelectorOnMainThread:withObject:waitUntilDone:'un neyi gerektirdiğini bilmediğini biliyorum çünkü şimdi başarısız bir cihazım var ve çağrılması gereken yönteme bir NSLog koydum. İyi işlev görür, ancak başarısız olan aygıtta, performSelectorOnMainThread:withObject:waitUntilDone: bu yöntemi çağırmak için kullanıldığında NSLog, çalıştırılmadığını gösterir ...

Bu, iOS 5 beta ile başlamıştır ve yine sürümde gerçekleşir. En çok 2 cihazımda olur, ancak diğer 10 cihazdan hiçbirinde kişisel olarak test ettim. Ben beta olarak bazı sorun dışında sadece benim cihaz olduğunu düşünmüştüm, ama benim yepyeni beta dokunmadık 4S yanı bir kullanıcının iPad 2'ye olduğu gibi (benim iPad 2) olur.

Gerçekten nereye bakmak için bilmiyorum. Ben yürütmek için söyler ve genellikle hemen hemen her cihazda yapar, ancak aynı çizgi bazı yanıtlar ve bazı hatalar vb. Alır ...

+0

Are CoreData'yı herhangi bir şansla kullanıyorsunuz? Benzer bir sorunum vardı. Gerçekten olan şey, diğer iş parçacığı yazmaya çalışırken CoreData kullanarak bir okuma işlemini gerçekleştirmek için bekleyen bir iş parçacığı kilitlenmesiydi. – picciano

+0

@picciano Bunu nasıl aştın? Aynı sorunu yaşıyorum ve çıkmazı gidermek için ne yapmam gerektiğini anlayamıyorum. –

cevap

3

performSelectorOnMainThread: withObject: waitUntilDone bazen wonky olabilir. Lib dağıtımı kullanmaya çalışmayı düşündün mü?

Bir blok oluşturmak ve bunun gibi ana iş parçacığı üzerinde yayınlayabilirsiniz:

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

Aynı etkileyecek tasarruf olurdu http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

bir iş parçacığının RunLoop sahiptir birkaç farklı modlar performSelectorOnMainThread:withObject:waitUntilDone kullanma gibi. süre içinde ana iş parçacığı performSelectorOnMainThread:withObject:WaitUntilDone: hedeflediği biridir varsayılan bir (farklı bir modda çalışıyor çağrı yapmak mümkündür.

performSelectorOnMainThread:withObject:waitUntilDone:modes:
Apple's documentation Bkz kullanmayı düşünün.

Ayrıca - GCD (libdispatch) müthiş, ama kendinize bir kilitlenme pişirme sizi korumaz: yönteminiz ana iş parçacığı üzerinde çalıştığı durumda düşünün ve aradığınız:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
});