mirror of
https://github.com/HackPlan/AsyncDisplayKit.git
synced 2026-04-01 08:45:09 +08:00
Merge pull request #1283 from Adlai-Holler/AHPendingStateLocking
[ASPendingStateController] Relinquish Lock Before Applying Pending States
This commit is contained in:
@@ -58,22 +58,18 @@
|
||||
[self scheduleFlushIfNeeded];
|
||||
}
|
||||
|
||||
/**
|
||||
* NOTE: There is a small re-entrancy hazard here.
|
||||
* If the user gives us a subclass of UIView/CALayer that
|
||||
* adds side-effects to property sets, and one side effect
|
||||
* waits on a background thread that sets a view/layer property
|
||||
* on a loaded node, then we've got a deadlock.
|
||||
*/
|
||||
- (void)flush
|
||||
{
|
||||
ASDisplayNodeAssertMainThread();
|
||||
ASDN::MutexLocker l(_lock);
|
||||
for (ASDisplayNode *node in _dirtyNodes) {
|
||||
_lock.lock();
|
||||
ASWeakSet *dirtyNodes = _dirtyNodes;
|
||||
_dirtyNodes = [[ASWeakSet alloc] init];
|
||||
_flags.pendingFlush = NO;
|
||||
_lock.unlock();
|
||||
|
||||
for (ASDisplayNode *node in dirtyNodes) {
|
||||
[node applyPendingViewState];
|
||||
}
|
||||
[_dirtyNodes removeAllObjects];
|
||||
_flags.pendingFlush = NO;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user