2011-10-11 16 views
5

, kötü şeyler olur. SorunCocoa Touch/UIKit'te, arka plan iş parçacığındaki kullanıcı arabirimindeki değişiklikler nasıl algılanır? Biz arka plan iplikten UI öğeleri güncellerseniz Kakao Touch'ta

, tüm zaman olmaz, bu nedenle dişler de hakkınızı tekmeler kadar bazı hafif arka plan UI karışma bir süre farkedilmeden gidebilir.

en kısa sürede birisi bir arka plandan bir öğe günceller gibi çöküyor veya konsola şey kaydeder iplik böylece bilgiçlik modda UIKit çalışmasını sağlamak için bir yol var mı? Eğer kullanıcı arayüzü güncelleştirmeleri yapmadan önce ana iş parçacığı üzerinde şeyler yapıyor ya değilse Kendini kontrol edebilirsiniz

cevap

2

. Kendimi aşağıdaki makroları yazdık:

/// Stick this in code you want to assert if run on the main UI thread. 
#define DONT_BLOCK_UI() \ 
    NSAssert(![NSThread isMainThread], @"Don't block the UI thread please!") 

/// Stick this in code you want to assert if run on a background thread. 
#define BLOCK_UI() \ 
    NSAssert([NSThread isMainThread], @"You aren't running in the UI thread!") 

Gruba yöntem A sonra bazı işlemleri yapar ve yöntemlerde kodumu eğilimi UI güncellemelerini yapar B yöntemi, çağırır. B yönteminin başında, UI üzerinde çalıştırılmıyorsa, BLOCK_UI() makrosunu yapıştırırım. Ayrıca, uzun süren görevler için diğer makroyu kullanıyorum. Bu makroları ve daha rastgele maddeleri https://github.com/gradha/ELHASO-iOS-snippets numaralı telefona koydum.

Bu makrolar maalesef bunları kullanarak disiplin gerektirir. Böyle durumlarla başa çıkmak için daha müdahaleci bir yolu da ana iş parçacığı değil kullanılsaydı iddia vekil (belki açılışında swizzling?) aracılığıyla tüm SDK arabirimi nesneleri sarmak için olabilir. Bu proxy/swizzling sadece gerçek debileri bogging önlemek için hata ayıklama yapıları veya simülatör ortamında gerçekleşir. Bunu yapmayı düşündüm ... ama düzgün bir şekilde yapılabilecek bir acıya benziyor.