Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.

Commit ff7a586

Browse files
Hannah Troisiappleguy
authored andcommitted
[ASVideoPlayerNode] Use ASDisplayNode base class lock for subclass property syncrhonization, fix retain cycles (#1878)
1 parent 1d07759 commit ff7a586

1 file changed

Lines changed: 27 additions & 19 deletions

File tree

AsyncDisplayKit/ASVideoPlayerNode.mm

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@
1212

1313
#import "ASVideoPlayerNode.h"
1414
#import "ASDefaultPlaybackButton.h"
15+
#import "ASDisplayNodeInternal.h"
1516

1617
static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext;
1718

1819
@interface ASVideoPlayerNode() <ASVideoNodeDelegate>
1920
{
20-
ASDN::RecursiveMutex _videoPlayerLock;
21-
2221
__weak id<ASVideoPlayerNodeDelegate> _delegate;
2322

2423
struct {
@@ -165,7 +164,7 @@ - (void)didLoad
165164
{
166165
[super didLoad];
167166
{
168-
ASDN::MutexLocker l(_videoPlayerLock);
167+
ASDN::MutexLocker l(_propertyLock);
169168
[self createControls];
170169
}
171170
}
@@ -174,7 +173,7 @@ - (void)visibleStateDidChange:(BOOL)isVisible
174173
{
175174
[super visibleStateDidChange:isVisible];
176175

177-
ASDN::MutexLocker l(_videoPlayerLock);
176+
ASDN::MutexLocker l(_propertyLock);
178177

179178
if (isVisible && _loadAssetWhenNodeBecomesVisible && _asset != _videoNode.asset) {
180179
_videoNode.asset = _asset;
@@ -196,7 +195,7 @@ - (NSArray *)createDefaultControlElementArray
196195
#pragma mark - UI
197196
- (void)createControls
198197
{
199-
ASDN::MutexLocker l(_videoPlayerLock);
198+
ASDN::MutexLocker l(_propertyLock);
200199

201200
if (_controlsDisabled) {
202201
return;
@@ -247,7 +246,7 @@ - (void)createControls
247246
}
248247

249248
ASPerformBlockOnMainThread(^{
250-
ASDN::MutexLocker l(_videoPlayerLock);
249+
ASDN::MutexLocker l(_propertyLock);
251250
[self setNeedsLayout];
252251
});
253252
}
@@ -323,32 +322,35 @@ - (void)createDurationTextField
323322
- (void)createScrubber
324323
{
325324
if (_scrubberNode == nil) {
326-
_scrubberNode = [[ASDisplayNode alloc] initWithViewBlock:^UIView * _Nonnull{
325+
__weak __typeof__(self) weakSelf = self;
326+
_scrubberNode = [[ASDisplayNode alloc] initWithViewBlock:^UIView * _Nonnull {
327+
__typeof__(self) strongSelf = weakSelf;
328+
327329
UISlider *slider = [[UISlider alloc] initWithFrame:CGRectZero];
328330
slider.minimumValue = 0.0;
329331
slider.maximumValue = 1.0;
330332

331333
if (_delegateFlags.delegateScrubberMinimumTrackTintColor) {
332-
slider.minimumTrackTintColor = [_delegate videoPlayerNodeScrubberMinimumTrackTint:self];
334+
slider.minimumTrackTintColor = [_delegate videoPlayerNodeScrubberMinimumTrackTint:strongSelf];
333335
}
334336

335337
if (_delegateFlags.delegateScrubberMaximumTrackTintColor) {
336-
slider.maximumTrackTintColor = [_delegate videoPlayerNodeScrubberMaximumTrackTint:self];
338+
slider.maximumTrackTintColor = [_delegate videoPlayerNodeScrubberMaximumTrackTint:strongSelf];
337339
}
338340

339341
if (_delegateFlags.delegateScrubberThumbTintColor) {
340-
slider.thumbTintColor = [_delegate videoPlayerNodeScrubberThumbTint:self];
342+
slider.thumbTintColor = [_delegate videoPlayerNodeScrubberThumbTint:strongSelf];
341343
}
342344

343345
if (_delegateFlags.delegateScrubberThumbImage) {
344-
UIImage *thumbImage = [_delegate videoPlayerNodeScrubberThumbImage:self];
346+
UIImage *thumbImage = [_delegate videoPlayerNodeScrubberThumbImage:strongSelf];
345347
[slider setThumbImage:thumbImage forState:UIControlStateNormal];
346348
}
347349

348350

349-
[slider addTarget:self action:@selector(beginSeek) forControlEvents:UIControlEventTouchDown];
350-
[slider addTarget:self action:@selector(endSeek) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside|UIControlEventTouchCancel];
351-
[slider addTarget:self action:@selector(seekTimeDidChange:) forControlEvents:UIControlEventValueChanged];
351+
[slider addTarget:strongSelf action:@selector(beginSeek) forControlEvents:UIControlEventTouchDown];
352+
[slider addTarget:strongSelf action:@selector(endSeek) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside|UIControlEventTouchCancel];
353+
[slider addTarget:strongSelf action:@selector(seekTimeDidChange:) forControlEvents:UIControlEventValueChanged];
352354

353355
return slider;
354356
}];
@@ -490,19 +492,25 @@ - (void)togglePlayPause
490492

491493
- (void)showSpinner
492494
{
493-
ASDN::MutexLocker l(_videoPlayerLock);
495+
ASDN::MutexLocker l(_propertyLock);
494496

495497
if (!_spinnerNode) {
498+
499+
__weak __typeof__(self) weakSelf = self;
496500
_spinnerNode = [[ASDisplayNode alloc] initWithViewBlock:^UIView *{
501+
__typeof__(self) strongSelf = weakSelf;
497502
UIActivityIndicatorView *spinnnerView = [[UIActivityIndicatorView alloc] init];
498-
spinnnerView.color = _defaultControlsColor;
503+
spinnnerView.backgroundColor = [UIColor clearColor];
504+
499505
if (_delegateFlags.delegateSpinnerTintColor) {
500-
spinnnerView.color = [_delegate videoPlayerNodeSpinnerTint:self];
506+
spinnnerView.color = [_delegate videoPlayerNodeSpinnerTint:strongSelf];
507+
} else {
508+
spinnnerView.color = _defaultControlsColor;
501509
}
510+
502511
return spinnnerView;
503512
}];
504513
_spinnerNode.preferredFrameSize = CGSizeMake(44.0, 44.0);
505-
_spinnerNode.backgroundColor = [UIColor clearColor];
506514

507515
[self addSubnode:_spinnerNode];
508516
[self setNeedsLayout];
@@ -512,7 +520,7 @@ - (void)showSpinner
512520

513521
- (void)removeSpinner
514522
{
515-
ASDN::MutexLocker l(_videoPlayerLock);
523+
ASDN::MutexLocker l(_propertyLock);
516524

517525
if (!_spinnerNode) {
518526
return;

0 commit comments

Comments
 (0)