Bazı sorunlar nedeniyle arka plan iş parçacığı üzerinde boyut hesaplamaları için döşeme yapıyorum, bu sorunla karşılaştım. setAnimationsEnabled:
swizzling tarafından -[UIImageView setImage:]
sadece arka plan iş parçacığı animasyonları devre dışı bırakma olduğunu bulundu.
if ([NSThread isMainThread]) {
self.answerImageView.image = [UIImage imageNamed:imgName];
}
Bu kayda değer ben bu basmayın: Bu görünüm render asla ve görüntü değişiklikleri benim hesaplanması için gerekli değildi çünkü
, bir ana iş parçacığı çağrısında bu testi içine başardı İlk görünüm örneğinde sorun çünkü bir Xib yükleme sorununu önlemek için şablon görünümlerimi ana iş parçacığına zaten yüklüyorum.
Diğer sorunlar daha karmaşık olabilir, ancak benzer çözümler bulabilmeniz gerekir. Animasyonların arka planını devre dışı bıraktığını tespit etmek için kullandığım kategori.
#import <UIKit/UIKit.h>
#import <JRSwizzle/JRSwizzle.h>
#ifdef DEBUG
@implementation UIView (BadBackgroundBehavior)
+ (void)load
{
NSError *error = nil;
if (![self jr_swizzleClassMethod:@selector(setAnimationsEnabled:) withClassMethod:@selector(SE_setAnimationsEnabled:) error:&error]) {
NSLog(@"Error! %@", error);
}
}
+ (void)SE_setAnimationsEnabled:(BOOL)enabled
{
NSAssert([NSThread isMainThread], @"This method is not thread safe. Look at the backtrace and decide if you really need to be doing this here.");
[self SE_setAnimationsEnabled:enabled];
}
@end
#endif
Güncelleme
Bir medya elemanını (: // 20314684 rdar) görüntülerken UIWebView
aslında setAnimationsEnabled:
için güvensiz çağrı yapar çıkıyor. Bu, uygulamanızın keyfi web içeriğine izin veriyorsa, yukarıdaki yöntemin her zaman aktif olmasını çok acı verici hale getirir. , Sen SEViewAlertForUnsafeBackgroundCalls
üzerinde sembolik bir kesme noktası ekleyerek veya sadece öbürünün uygulamanızı durdurabilirsiniz
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
#ifdef DEBUG
void SEViewAlertForUnsafeBackgroundCalls() {
NSLog(@"----------------------------------------------------------------------------------");
NSLog(@"Background call to setAnimationsEnabled: detected. This method is not thread safe.");
NSLog(@"Set a breakpoint at SEUIViewDidSetAnimationsOffMainThread to inspect this call.");
NSLog(@"----------------------------------------------------------------------------------");
}
@implementation UIView (BadBackgroundBehavior)
+ (void)load
{
method_exchangeImplementations(class_getInstanceMethod(object_getClass(self), @selector(setAnimationsEnabled:)),
class_getInstanceMethod(object_getClass(self), @selector(SE_setAnimationsEnabled:)));
}
+ (void)SE_setAnimationsEnabled:(BOOL)enabled
{
if (![NSThread isMainThread]) {
SEViewAlertForUnsafeBackgroundCalls();
}
[self SE_setAnimationsEnabled:enabled];
}
@end
#endif
Bu kod ile: Bunun yerine bu beni üzerinde kesme noktası açmak ve kapatmak ve başarısızlık sonra devam edelim aşağıda yöntemini kullanmaya başladıktan işlev gövdesinde bir kesme noktası.
Gist
Bunun arkasında nedenini bilmiyorum ama ben tam aynı sorunu vardı ve kaldırıldı zaman çözüldü bir tableView: willDisplayCell: forRowAtIndexPath: resimleri görüntülemek için performSelectorInBackground sürü çağırmak için kullanılan yöntem. Bu, sorunu çözmek için bazı ipuçları verebilir veya verebilir. – Mohammad
Aslında öğrendim.Bu arka planda thread UIKit şeyler yaptığınızda olur.Here her şeyi açıklar bağlantıdır. http://stackoverflow.com/questions/18281097/uiviewcontroller-animations-stop-working – user1010819