Remove ASImageNode thread affinity asserts (#57).

This commit is contained in:
Nadine Salter
2014-10-21 17:28:59 -07:00
parent 367b6da116
commit 72f9cb9d73
4 changed files with 30 additions and 28 deletions

View File

@@ -63,6 +63,17 @@ CGFloat ASDisplayNodeScreenScale()
return screenScale;
}
void ASDisplayNodePerformBlockOnMainThread(void (^block)())
{
if ([NSThread isMainThread]) {
block();
} else {
dispatch_async(dispatch_get_main_queue(), ^{
block();
});
}
}
+ (void)initialize
{
if (self == [ASDisplayNode class]) {

View File

@@ -106,35 +106,35 @@
- (void)setImage:(UIImage *)image
{
ASDisplayNodeAssertThreadAffinity(self);
ASDN::MutexLocker l(_imageLock);
if (_image != image) {
_image = image;
[self invalidateCalculatedSize];
[self setNeedsDisplay];
ASDisplayNodePerformBlockOnMainThread(^{
[self invalidateCalculatedSize];
[self setNeedsDisplay];
});
}
}
- (UIImage *)image
{
ASDisplayNodeAssertThreadAffinity(self);
ASDN::MutexLocker l(_imageLock);
return _image;
}
- (void)setTint:(ASImageNodeTint)tint
{
ASDisplayNodeAssertThreadAffinity(self);
ASDN::MutexLocker l(_imageLock);
if (_tint != tint) {
_tint = tint;
[self setNeedsDisplay];
ASDisplayNodePerformBlockOnMainThread(^{
[self setNeedsDisplay];
});
}
}
- (ASImageNodeTint)tint
{
ASDisplayNodeAssertThreadAffinity(self);
ASDN::MutexLocker l(_imageLock);
return _tint;
}
@@ -281,19 +281,16 @@
#pragma mark - Cropping
- (BOOL)isCropEnabled
{
ASDisplayNodeAssertThreadAffinity(self);
return _cropEnabled;
}
- (void)setCropEnabled:(BOOL)cropEnabled
{
ASDisplayNodeAssertThreadAffinity(self);
[self setCropEnabled:cropEnabled recropImmediately:NO inBounds:self.bounds];
}
- (void)setCropEnabled:(BOOL)cropEnabled recropImmediately:(BOOL)recropImmediately inBounds:(CGRect)cropBounds
{
ASDisplayNodeAssertThreadAffinity(self);
if (_cropEnabled == cropEnabled)
return;
@@ -303,23 +300,22 @@
// If we have an image to display, display it, respecting our recrop flag.
if (self.image)
{
if (recropImmediately)
[self displayImmediately];
else
[self setNeedsDisplay];
ASDisplayNodePerformBlockOnMainThread(^{
if (recropImmediately)
[self displayImmediately];
else
[self setNeedsDisplay];
});
}
}
- (CGRect)cropRect
{
ASDisplayNodeAssertThreadAffinity(self);
return _cropRect;
}
- (void)setCropRect:(CGRect)cropRect
{
ASDisplayNodeAssertThreadAffinity(self);
if (CGRectEqualToRect(_cropRect, cropRect))
return;
@@ -332,8 +328,10 @@
BOOL isCroppingImage = ((boundsSize.width < imageSize.width) || (boundsSize.height < imageSize.height));
// Re-display if we need to.
if (self.nodeLoaded && self.contentMode == UIViewContentModeScaleAspectFill && isCroppingImage)
[self setNeedsDisplay];
ASDisplayNodePerformBlockOnMainThread(^{
if (self.nodeLoaded && self.contentMode == UIViewContentModeScaleAspectFill && isCroppingImage)
[self setNeedsDisplay];
});
}
@end

View File

@@ -20,6 +20,7 @@
BOOL ASDisplayNodeSubclassOverridesSelector(Class subclass, SEL selector);
CGFloat ASDisplayNodeScreenScale();
void ASDisplayNodePerformBlockOnMainThread(void (^block)());
@class _ASPendingState;

View File

@@ -138,15 +138,7 @@ static const CGFloat kInnerPadding = 10.0f;
return;
// set our image node's data
if (_imageNode.nodeLoaded) {
dispatch_sync(dispatch_get_main_queue(), ^{
// once the node's view is loaded, the node should only be used on the main thread
_imageNode.image = [UIImage imageWithData:data];
});
} else {
// if the node hasn't loaded, we can use it on a background thread
_imageNode.image = [UIImage imageWithData:data];
}
_imageNode.image = [UIImage imageWithData:data];
}];
}