Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class FirebaseDatabasePlugin
implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler {
protected static final HashMap<String, FirebaseDatabase> databaseInstanceCache = new HashMap<>();
private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_database";
private final Map<String, Integer> queryListenersCount = new HashMap<>();
private int listenerCount = 0;
private final Map<EventChannel, StreamHandler> streamHandlers = new HashMap<>();
private MethodChannel methodChannel;
private BinaryMessenger messenger;
Expand Down Expand Up @@ -272,28 +272,14 @@ private Task<String> observe(Map<String, Object> arguments) {
final Query query = getQuery(arguments);
final String eventChannelNamePrefix =
(String) arguments.get(Constants.EVENT_CHANNEL_NAME_PREFIX);
final String eventChannelName = eventChannelNamePrefix + "#" + listenerCount++;

int newListenersCount;
synchronized (queryListenersCount) {
Integer currentListenersCount = queryListenersCount.get(eventChannelNamePrefix);
newListenersCount = currentListenersCount == null ? 1 : currentListenersCount + 1;
queryListenersCount.put(eventChannelNamePrefix, newListenersCount);
}

final String eventChannelName = eventChannelNamePrefix + "#" + newListenersCount;
final EventChannel eventChannel = new EventChannel(messenger, eventChannelName);
final EventStreamHandler streamHandler =
new EventStreamHandler(
query,
() -> {
eventChannel.setStreamHandler(null);
synchronized (queryListenersCount) {
Integer currentListenersCount =
queryListenersCount.get(eventChannelNamePrefix);
queryListenersCount.put(
eventChannelNamePrefix,
currentListenersCount == null ? 0 : currentListenersCount - 1);
}
});

eventChannel.setStreamHandler(streamHandler);
Expand Down Expand Up @@ -476,9 +462,6 @@ public Task<Void> didReinitializeFirebaseCore() {

private void cleanup() {
removeEventStreamHandlers();
synchronized (queryListenersCount) {
queryListenersCount.clear();
}
databaseInstanceCache.clear();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
@implementation FLTFirebaseDatabasePlugin {
// Used by FlutterStreamHandlers.
NSObject<FlutterBinaryMessenger> *_binaryMessenger;
NSMutableDictionary<NSString *, NSNumber *> *_listenerCounts;
NSMutableDictionary<NSString *, FLTFirebaseDatabaseObserveStreamHandler *> *_streamHandlers;
// Used by transactions.
FlutterMethodChannel *_channel;
int _listenerCount;
}

#pragma mark - FlutterPlugin
Expand All @@ -27,8 +27,8 @@ - (instancetype)init:(NSObject<FlutterBinaryMessenger> *)messenger
if (self) {
_channel = channel;
_binaryMessenger = messenger;
_listenerCounts = [NSMutableDictionary dictionary];
_streamHandlers = [NSMutableDictionary dictionary];
_listenerCount = 0;
}
return self;
}
Expand Down Expand Up @@ -355,31 +355,17 @@ - (void)queryKeepSynced:(id)arguments withMethodCallResult:(FLTFirebaseMethodCal
- (void)queryObserve:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResult *)result {
FIRDatabaseQuery *databaseQuery = [FLTFirebaseDatabaseUtils databaseQueryFromArguments:arguments];
NSString *eventChannelNamePrefix = arguments[@"eventChannelNamePrefix"];
int newListenersCount;
@synchronized(_listenerCounts) {
NSNumber *currentListenersCount = _listenerCounts[eventChannelNamePrefix];
newListenersCount = currentListenersCount == nil ? 1 : [currentListenersCount intValue] + 1;
_listenerCounts[eventChannelNamePrefix] = @(newListenersCount);
}
_listenerCount = _listenerCount + 1;
NSString *eventChannelName =
[NSString stringWithFormat:@"%@#%d", eventChannelNamePrefix, newListenersCount];
[NSString stringWithFormat:@"%@#%i", eventChannelNamePrefix, _listenerCount];

FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:eventChannelName
binaryMessenger:_binaryMessenger];
__weak FLTFirebaseDatabasePlugin *weakSelf = self;
FLTFirebaseDatabaseObserveStreamHandler *streamHandler =
[[FLTFirebaseDatabaseObserveStreamHandler alloc]
initWithFIRDatabaseQuery:databaseQuery
andOnDisposeBlock:^() {
__strong FLTFirebaseDatabasePlugin *strongSelf = weakSelf;
[eventChannel setStreamHandler:nil];
@synchronized(strongSelf->_listenerCounts) {
NSNumber *currentListenersCount =
strongSelf->_listenerCounts[eventChannelNamePrefix];
strongSelf->_listenerCounts[eventChannelNamePrefix] =
@(currentListenersCount == nil ? 0 : [currentListenersCount intValue] - 1);
}
}];
[[FLTFirebaseDatabaseObserveStreamHandler alloc] initWithFIRDatabaseQuery:databaseQuery
andOnDisposeBlock:^() {
[eventChannel setStreamHandler:nil];
}];
[eventChannel setStreamHandler:streamHandler];
_streamHandlers[eventChannelName] = streamHandler;
result.success(eventChannelName);
Expand Down