setNeedsDisplay must be called on main

This commit is contained in:
Shannon Ma
2015-07-31 12:11:19 -07:00
parent f7a4ca45db
commit 15133fdbf7
4 changed files with 58 additions and 20 deletions

View File

@@ -64,6 +64,22 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)())
} }
} }
void ASDisplayNodeRespectThreadAffinityOfNode(ASDisplayNode *node, void (^block)())
{
ASDisplayNodeCAssertNotNil(block, @"block is required");
if (!block) {
return;
}
if (node.nodeLoaded) {
ASDisplayNodePerformBlockOnMainThread(^{
block();
});
} else {
block();
}
}
+ (void)initialize + (void)initialize
{ {
if (self == [ASDisplayNode class]) { if (self == [ASDisplayNode class]) {

View File

@@ -11,6 +11,7 @@
#import <AsyncDisplayKit/_ASDisplayLayer.h> #import <AsyncDisplayKit/_ASDisplayLayer.h>
#import <AsyncDisplayKit/ASAssert.h> #import <AsyncDisplayKit/ASAssert.h>
#import <AsyncDisplayKit/ASDisplayNode+Subclasses.h> #import <AsyncDisplayKit/ASDisplayNode+Subclasses.h>
#import <AsyncDisplayKit/ASDisplayNodeInternal.h>
#import <AsyncDisplayKit/ASHighlightOverlayLayer.h> #import <AsyncDisplayKit/ASHighlightOverlayLayer.h>
#import <AsyncDisplayKit/ASTextNodeCoreTextAdditions.h> #import <AsyncDisplayKit/ASTextNodeCoreTextAdditions.h>
#import <AsyncDisplayKit/ASTextNodeTextKitHelpers.h> #import <AsyncDisplayKit/ASTextNodeTextKitHelpers.h>
@@ -202,7 +203,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
_constrainedSize = constrainedSizeForText; _constrainedSize = constrainedSizeForText;
[self _invalidateRenderer]; [self _invalidateRenderer];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
CGSize rendererSize = [[self _renderer] size]; CGSize rendererSize = [[self _renderer] size];
// Add shadow padding back // Add shadow padding back
@@ -337,19 +340,21 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
// We need an entirely new renderer // We need an entirely new renderer
[self _invalidateRenderer]; [self _invalidateRenderer];
// Tell the display node superclasses that the cached layout is incorrect now ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self invalidateCalculatedLayout]; // Tell the display node superclasses that the cached layout is incorrect now
[self invalidateCalculatedLayout];
[self setNeedsDisplay]; [self setNeedsDisplay];
self.accessibilityLabel = _attributedString.string; self.accessibilityLabel = _attributedString.string;
if (_attributedString.length == 0) { if (_attributedString.length == 0) {
// We're not an accessibility element by default if there is no string. // We're not an accessibility element by default if there is no string.
self.isAccessibilityElement = NO; self.isAccessibilityElement = NO;
} else { } else {
self.isAccessibilityElement = YES; self.isAccessibilityElement = YES;
} }
});
} }
#pragma mark - Text Layout #pragma mark - Text Layout
@@ -360,7 +365,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
_exclusionPaths = exclusionPaths; _exclusionPaths = exclusionPaths;
[self _invalidateRenderer]; [self _invalidateRenderer];
[self invalidateCalculatedLayout]; [self invalidateCalculatedLayout];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
} }
} }
@@ -897,7 +904,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
} }
_shadowColor = shadowColor; _shadowColor = shadowColor;
[self _invalidateShadower]; [self _invalidateShadower];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
} }
} }
@@ -911,7 +920,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
if (!CGSizeEqualToSize(_shadowOffset, shadowOffset)) { if (!CGSizeEqualToSize(_shadowOffset, shadowOffset)) {
_shadowOffset = shadowOffset; _shadowOffset = shadowOffset;
[self _invalidateShadower]; [self _invalidateShadower];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
} }
} }
@@ -925,7 +936,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
if (_shadowOpacity != shadowOpacity) { if (_shadowOpacity != shadowOpacity) {
_shadowOpacity = shadowOpacity; _shadowOpacity = shadowOpacity;
[self _invalidateShadower]; [self _invalidateShadower];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
} }
} }
@@ -939,7 +952,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
if (_shadowRadius != shadowRadius) { if (_shadowRadius != shadowRadius) {
_shadowRadius = shadowRadius; _shadowRadius = shadowRadius;
[self _invalidateShadower]; [self _invalidateShadower];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
} }
} }
@@ -981,7 +996,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
if (_truncationMode != truncationMode) { if (_truncationMode != truncationMode) {
_truncationMode = truncationMode; _truncationMode = truncationMode;
[self _invalidateRenderer]; [self _invalidateRenderer];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
} }
} }
@@ -994,8 +1011,10 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
{ {
if (_maximumLineCount != maximumLineCount) { if (_maximumLineCount != maximumLineCount) {
_maximumLineCount = maximumLineCount; _maximumLineCount = maximumLineCount;
[self _invalidateRenderer]; [self _invalidateRenderer];
ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay]; [self setNeedsDisplay];
});
} }
} }
@@ -1010,7 +1029,9 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
{ {
_composedTruncationString = [self _prepareTruncationStringForDrawing:[self _composedTruncationString]]; _composedTruncationString = [self _prepareTruncationStringForDrawing:[self _composedTruncationString]];
[self _invalidateRenderer]; [self _invalidateRenderer];
[self setNeedsDisplay]; ASDisplayNodeRespectThreadAffinityOfNode(self, ^{
[self setNeedsDisplay];
});
} }
/** /**

View File

@@ -20,6 +20,7 @@
BOOL ASDisplayNodeSubclassOverridesSelector(Class subclass, SEL selector); BOOL ASDisplayNodeSubclassOverridesSelector(Class subclass, SEL selector);
void ASDisplayNodePerformBlockOnMainThread(void (^block)()); void ASDisplayNodePerformBlockOnMainThread(void (^block)());
void ASDisplayNodeRespectThreadAffinityOfNode(ASDisplayNode *node, void (^block)());
typedef NS_OPTIONS(NSUInteger, ASDisplayNodeMethodOverrides) { typedef NS_OPTIONS(NSUInteger, ASDisplayNodeMethodOverrides) {
ASDisplayNodeMethodOverrideNone = 0, ASDisplayNodeMethodOverrideNone = 0,

View File

@@ -10,4 +10,4 @@ SPEC CHECKSUMS:
FBSnapshotTestCase: 3dc3899168747a0319c5278f5b3445c13a6532dd FBSnapshotTestCase: 3dc3899168747a0319c5278f5b3445c13a6532dd
OCMock: a6a7dc0e3997fb9f35d99f72528698ebf60d64f2 OCMock: a6a7dc0e3997fb9f35d99f72528698ebf60d64f2
COCOAPODS: 0.37.2 COCOAPODS: 0.38.2