diff --git a/AsyncDisplayKit/ASImageNode+AnimatedImage.mm b/AsyncDisplayKit/ASImageNode+AnimatedImage.mm index ffebb96317..6cef1f9035 100644 --- a/AsyncDisplayKit/ASImageNode+AnimatedImage.mm +++ b/AsyncDisplayKit/ASImageNode+AnimatedImage.mm @@ -85,6 +85,23 @@ } } +- (NSString *)animatedImageRunLoopMode +{ + ASDN::MutexLocker l(_displayLinkLock); + return _animatedImageRunLoopMode; +} + +- (void)setAnimatedImageRunLoopMode:(NSString *)runLoopMode +{ + ASDN::MutexLocker l(_displayLinkLock); + + if (_displayLink != nil) { + [_displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:_animatedImageRunLoopMode]; + [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:runLoopMode]; + } + _animatedImageRunLoopMode = runLoopMode; +} + - (void)animatedImageFileReady { ASPerformBlockOnMainThread(^{ @@ -116,7 +133,7 @@ _displayLink = [CADisplayLink displayLinkWithTarget:[ASWeakProxy weakProxyWithTarget:self] selector:@selector(displayLinkFired:)]; _displayLink.frameInterval = self.animatedImage.frameInterval; - [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; + [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:_animatedImageRunLoopMode]; } else { _displayLink.paused = NO; } diff --git a/AsyncDisplayKit/ASImageNode.h b/AsyncDisplayKit/ASImageNode.h index b9c52dcafe..88927ff43d 100644 --- a/AsyncDisplayKit/ASImageNode.h +++ b/AsyncDisplayKit/ASImageNode.h @@ -141,6 +141,13 @@ typedef UIImage * _Nullable (^asimagenode_modification_block_t)(UIImage *image); */ @property (atomic, assign) BOOL animatedImagePaused; +/** + * @abstract The runloop mode used to animte th image. + * + * @discussion Defaults to NSDefaultRunLoopMode. Another commonly used mode is NSRunLoopCommonModes. + */ +@property (atomic, strong) NSString *animatedImageRunLoopMode; + @end diff --git a/AsyncDisplayKit/ASImageNode.mm b/AsyncDisplayKit/ASImageNode.mm index 40ff02c964..ad9eaaf5c8 100644 --- a/AsyncDisplayKit/ASImageNode.mm +++ b/AsyncDisplayKit/ASImageNode.mm @@ -105,6 +105,7 @@ _cropRect = CGRectMake(0.5, 0.5, 0, 0); _cropDisplayBounds = CGRectNull; _placeholderColor = ASDisplayNodeDefaultPlaceholderColor(); + _animatedImageRunLoopMode = NSDefaultRunLoopMode; return self; } diff --git a/AsyncDisplayKit/Private/ASImageNode+AnimatedImagePrivate.h b/AsyncDisplayKit/Private/ASImageNode+AnimatedImagePrivate.h index d122c4e5d4..fe8fd1b730 100644 --- a/AsyncDisplayKit/Private/ASImageNode+AnimatedImagePrivate.h +++ b/AsyncDisplayKit/Private/ASImageNode+AnimatedImagePrivate.h @@ -14,6 +14,7 @@ ASDN::Mutex _displayLinkLock; id _animatedImage; BOOL _animatedImagePaused; + NSString *_animatedImageRunLoopMode; CADisplayLink *_displayLink; //accessed on main thread only