-
Notifications
You must be signed in to change notification settings - Fork 24.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
RCTUIManagerObserverCoordinator: new way to subscribe for granular no…
…tifications from UI Manager Reviewed By: majak Differential Revision: D4868591 fbshipit-source-id: 24a09ffa3e69dec5ce1f0a8715c7e4701d781996
- Loading branch information
1 parent
2a98432
commit 712b1dd
Showing
7 changed files
with
183 additions
and
56 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/** | ||
* Copyright (c) 2015-present, Facebook, Inc. | ||
* All rights reserved. | ||
* | ||
* This source code is licensed under the BSD-style license found in the | ||
* LICENSE file in the root directory of this source tree. An additional grant | ||
* of patent rights can be found in the PATENTS file in the same directory. | ||
*/ | ||
|
||
#import <UIKit/UIKit.h> | ||
|
||
#import <React/RCTViewManager.h> | ||
|
||
/** | ||
* Allows to hook into UIManager internals. This can be used to execute code at | ||
* specific points during the view updating process. | ||
* All observer handler is called on UIManager queue. | ||
*/ | ||
@protocol RCTUIManagerObserver <NSObject> | ||
|
||
@optional | ||
|
||
/** | ||
* Called just before the UIManager layout views. | ||
* It allows performing some operation for components which contain custom | ||
* layout logic right before regular Yoga based layout. So, for instance, | ||
* some components which have own React-independent state can compute and cache | ||
* own intrinsic content size (which will be used by Yoga) at this point. | ||
*/ | ||
- (void)uiManagerWillPerformLayout:(RCTUIManager *)manager; | ||
|
||
/** | ||
* Called just after the UIManager layout views. | ||
* It allows performing custom layout logic right after regular Yoga based layout. | ||
* So, for instance, this can be used for computing final layout for a component, | ||
* since it has its final frame set by Yoga at this point. | ||
*/ | ||
- (void)uiManagerDidPerformLayout:(RCTUIManager *)manager; | ||
|
||
/** | ||
* Called before flushing UI blocks at the end of a batch. Note that this won't | ||
* get called for partial batches when using `unsafeFlushUIChangesBeforeBatchEnds`. | ||
* This is called from the UIManager queue. Can be used to add UI operations in that batch. | ||
*/ | ||
- (void)uiManagerWillFlushUIBlocks:(RCTUIManager *)manager; | ||
|
||
@end | ||
|
||
/** | ||
* Simple helper which take care of RCTUIManager's observers. | ||
*/ | ||
@interface RCTUIManagerObserverCoordinator : NSObject <RCTUIManagerObserver> | ||
|
||
/** | ||
* Add a UIManagerObserver. See the `RCTUIManagerObserver` protocol for more info. | ||
* References to observers are held weakly. | ||
* This method can be called safely from any queue. | ||
*/ | ||
- (void)addObserver:(id<RCTUIManagerObserver>)observer; | ||
|
||
/** | ||
* Remove a `UIManagerObserver`. | ||
* This method can be called safely from any queue. | ||
*/ | ||
- (void)removeObserver:(id<RCTUIManagerObserver>)observer; | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/** | ||
* Copyright (c) 2015-present, Facebook, Inc. | ||
* All rights reserved. | ||
* | ||
* This source code is licensed under the BSD-style license found in the | ||
* LICENSE file in the root directory of this source tree. An additional grant | ||
* of patent rights can be found in the PATENTS file in the same directory. | ||
*/ | ||
|
||
#import "RCTUIManagerObserverCoordinator.h" | ||
|
||
#import "RCTUIManager.h" | ||
|
||
@implementation RCTUIManagerObserverCoordinator { | ||
NSHashTable<id<RCTUIManagerObserver>> *_observers; | ||
} | ||
|
||
- (instancetype)init | ||
{ | ||
if (self = [super init]) { | ||
_observers = [[NSHashTable alloc] initWithOptions:NSHashTableWeakMemory capacity:0]; | ||
} | ||
|
||
return self; | ||
} | ||
|
||
- (void)addObserver:(id<RCTUIManagerObserver>)observer | ||
{ | ||
dispatch_async(RCTGetUIManagerQueue(), ^{ | ||
[self->_observers addObject:observer]; | ||
}); | ||
} | ||
|
||
- (void)removeObserver:(id<RCTUIManagerObserver>)observer | ||
{ | ||
dispatch_async(RCTGetUIManagerQueue(), ^{ | ||
[self->_observers removeObject:observer]; | ||
}); | ||
} | ||
|
||
#pragma mark - RCTUIManagerObserver | ||
|
||
- (void)uiManagerWillPerformLayout:(RCTUIManager *)manager | ||
{ | ||
for (id<RCTUIManagerObserver> observer in _observers) { | ||
if ([observer respondsToSelector:@selector(uiManagerWillPerformLayout:)]) { | ||
[observer uiManagerWillPerformLayout:manager]; | ||
} | ||
} | ||
} | ||
|
||
- (void)uiManagerDidPerformLayout:(RCTUIManager *)manager | ||
{ | ||
for (id<RCTUIManagerObserver> observer in _observers) { | ||
if ([observer respondsToSelector:@selector(uiManagerDidPerformLayout:)]) { | ||
[observer uiManagerDidPerformLayout:manager]; | ||
} | ||
} | ||
} | ||
|
||
- (void)uiManagerWillFlushUIBlocks:(RCTUIManager *)manager | ||
{ | ||
for (id<RCTUIManagerObserver> observer in _observers) { | ||
if ([observer respondsToSelector:@selector(uiManagerWillFlushUIBlocks:)]) { | ||
[observer uiManagerWillFlushUIBlocks:manager]; | ||
} | ||
} | ||
} | ||
|
||
@end |
Oops, something went wrong.