diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm index d64db0b0d..bb958fdc3 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm @@ -24,9 +24,8 @@ NSMapTable* _trackedObjects; NSString* _lastHighlightedNode; NSMutableSet* _invalidObjects; - Boolean _invalidateMessageQueued; - NSDate* _lastInvalidateMessage; - std::mutex invalidObjectsMutex; + BOOL _invalidateMessageQueued; + std::mutex _invalidObjectsMutex; id _rootNode; id _tapListener; @@ -49,10 +48,7 @@ if (self = [super init]) { _descriptorMapper = mapper; _trackedObjects = [NSMapTable strongToWeakObjectsMapTable]; - _lastHighlightedNode = nil; _invalidObjects = [NSMutableSet new]; - _invalidateMessageQueued = false; - _lastInvalidateMessage = [NSDate date]; _rootNode = rootNode; _tapListener = tapListener; @@ -399,36 +395,33 @@ [descriptor invalidateNode:node]; // Collect invalidate messages before sending in a batch - std::lock_guard lock(invalidObjectsMutex); + std::lock_guard lock(_invalidObjectsMutex); [_invalidObjects addObject:nodeId]; if (_invalidateMessageQueued) { return; } - _invalidateMessageQueued = true; + _invalidateMessageQueued = YES; - if (_lastInvalidateMessage.timeIntervalSinceNow < -1) { - dispatch_after( - dispatch_time(DISPATCH_TIME_NOW, 500 * NSEC_PER_MSEC), - dispatch_get_main_queue(), - ^{ - [self reportInvalidatedObjects]; - }); - } + dispatch_after( + dispatch_time(DISPATCH_TIME_NOW, 500 * NSEC_PER_MSEC), + dispatch_get_main_queue(), + ^{ + [self _reportInvalidatedObjects]; + }); } -- (void)reportInvalidatedObjects { - std::lock_guard lock(invalidObjectsMutex); +- (void)_reportInvalidatedObjects { NSMutableArray* nodes = [NSMutableArray new]; - for (NSString* nodeId in self->_invalidObjects) { - [nodes addObject:[NSDictionary dictionaryWithObject:nodeId forKey:@"id"]]; - } - [self->_connection send:@"invalidate" - withParams:[NSDictionary dictionaryWithObject:nodes - forKey:@"nodes"]]; - self->_lastInvalidateMessage = [NSDate date]; - self->_invalidObjects = [NSMutableSet new]; - self->_invalidateMessageQueued = false; - return; + { // scope mutex acquisition + std::lock_guard lock(_invalidObjectsMutex); + for (NSString* nodeId in _invalidObjects) { + [nodes addObject:@{@"id" : nodeId}]; + } + _invalidObjects = [NSMutableSet new]; + _invalidateMessageQueued = NO; + } // release mutex before calling out to other code + + [_connection send:@"invalidate" withParams:@{@"nodes" : nodes}]; } - (void)updateNodeReference:(id)node {