Skip to content

Commit 14b4a55

Browse files
russellwheatleyLyokone
authored andcommitted
fix(storage, apple): clean up event channel, stream handler and task on completion (#16708)
1 parent 03e85ae commit 14b4a55

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

packages/firebase_storage/firebase_storage/ios/Classes/FLTFirebaseStoragePlugin.h

+1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@
1919

2020
+ (NSDictionary *)parseTaskSnapshot:(FIRStorageTaskSnapshot *)snapshot;
2121
+ (NSDictionary *)NSDictionaryFromNSError:(NSError *)error;
22+
- (void)cleanUpTask:(NSString *)channelName handle:(NSNumber *)handle;
2223
@end

packages/firebase_storage/firebase_storage/ios/Classes/FLTFirebaseStoragePlugin.m

+26-6
Original file line numberDiff line numberDiff line change
@@ -412,10 +412,10 @@ - (void)referencePutDataApp:(PigeonStorageFirebaseApp *)app
412412
self->_tasks[handle] = task;
413413
}
414414

415-
completion([self setupTaskListeners:task], nil);
415+
completion([self setupTaskListeners:task handle:handle], nil);
416416
}
417417

418-
- (NSString *)setupTaskListeners:(FIRStorageObservableTask *)task {
418+
- (NSString *)setupTaskListeners:(FIRStorageObservableTask *)task handle:(NSNumber *)handle {
419419
// Generate a random UUID to register with
420420
NSString *uuid = [[NSUUID UUID] UUIDString];
421421

@@ -426,7 +426,10 @@ - (NSString *)setupTaskListeners:(FIRStorageObservableTask *)task {
426426
FlutterEventChannel *channel = [FlutterEventChannel eventChannelWithName:channelName
427427
binaryMessenger:_binaryMessenger];
428428
FLTTaskStateChannelStreamHandler *handler =
429-
[[FLTTaskStateChannelStreamHandler alloc] initWithTask:task];
429+
[[FLTTaskStateChannelStreamHandler alloc] initWithTask:task
430+
storagePlugin:self
431+
channelName:channelName
432+
handle:handle];
430433
[channel setStreamHandler:handler];
431434

432435
[_eventChannels setObject:channel forKey:channelName];
@@ -435,6 +438,23 @@ - (NSString *)setupTaskListeners:(FIRStorageObservableTask *)task {
435438
return uuid;
436439
}
437440

441+
- (void)cleanUpTask:(NSString *)channelName handle:(NSNumber *)handle {
442+
NSObject<FlutterStreamHandler> *handler = [_streamHandlers objectForKey:channelName];
443+
if (handler) {
444+
[_streamHandlers removeObjectForKey:channelName];
445+
}
446+
447+
FlutterEventChannel *channel = [_eventChannels objectForKey:channelName];
448+
if (channel) {
449+
[channel setStreamHandler:nil];
450+
[_eventChannels removeObjectForKey:channelName];
451+
}
452+
453+
@synchronized(self->_tasks) {
454+
[self->_tasks removeObjectForKey:handle];
455+
}
456+
}
457+
438458
- (void)referencePutStringApp:(PigeonStorageFirebaseApp *)app
439459
reference:(PigeonStorageReference *)reference
440460
data:(NSString *)data
@@ -456,7 +476,7 @@ - (void)referencePutStringApp:(PigeonStorageFirebaseApp *)app
456476
self->_tasks[handle] = task;
457477
}
458478

459-
completion([self setupTaskListeners:task], nil);
479+
completion([self setupTaskListeners:task handle:handle], nil);
460480
}
461481

462482
- (void)referencePutFileApp:(PigeonStorageFirebaseApp *)app
@@ -481,7 +501,7 @@ - (void)referencePutFileApp:(PigeonStorageFirebaseApp *)app
481501
self->_tasks[handle] = task;
482502
}
483503

484-
completion([self setupTaskListeners:task], nil);
504+
completion([self setupTaskListeners:task handle:handle], nil);
485505
}
486506

487507
- (void)referenceDownloadFileApp:(PigeonStorageFirebaseApp *)app
@@ -501,7 +521,7 @@ - (void)referenceDownloadFileApp:(PigeonStorageFirebaseApp *)app
501521
self->_tasks[handle] = task;
502522
}
503523

504-
completion([self setupTaskListeners:task], nil);
524+
completion([self setupTaskListeners:task handle:handle], nil);
505525
}
506526

507527
- (void)referenceUpdateMetadataApp:(PigeonStorageFirebaseApp *)app

packages/firebase_storage/firebase_storage/ios/Classes/FLTTaskStateChannelStreamHandler.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
NS_ASSUME_NONNULL_BEGIN
1818

1919
@interface FLTTaskStateChannelStreamHandler : NSObject <FlutterStreamHandler>
20-
21-
- (instancetype)initWithTask:(FIRStorageObservableTask *)task;
20+
- (instancetype)initWithTask:(FIRStorageObservableTask *)task
21+
storagePlugin:(FLTFirebaseStoragePlugin *)storagePlugin
22+
channelName:(NSString *)channelName
23+
handle:(NSNumber *)handle;
2224

2325
@end
2426

packages/firebase_storage/firebase_storage/ios/Classes/FLTTaskStateChannelStreamHandler.m

+14-2
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,25 @@
99

1010
@implementation FLTTaskStateChannelStreamHandler {
1111
FIRStorageObservableTask *_task;
12-
12+
FLTFirebaseStoragePlugin *_storagePlugin;
13+
NSString *_channelName;
14+
NSNumber *_handle;
1315
FIRStorageHandle successHandle;
1416
FIRStorageHandle failureHandle;
1517
FIRStorageHandle pausedHandle;
1618
FIRStorageHandle progressHandle;
1719
}
1820

19-
- (instancetype)initWithTask:(FIRStorageObservableTask *)task {
21+
- (instancetype)initWithTask:(FIRStorageObservableTask *)task
22+
storagePlugin:(FLTFirebaseStoragePlugin *)storagePlugin
23+
channelName:(NSString *)channelName
24+
handle:(NSNumber *)handle {
2025
self = [super init];
2126
if (self) {
2227
_task = task;
28+
_storagePlugin = storagePlugin;
29+
_channelName = channelName;
30+
_handle = handle;
2331
}
2432
return self;
2533
}
@@ -98,6 +106,10 @@ - (FlutterError *)onCancelWithArguments:(id)arguments {
98106
}
99107
progressHandle = nil;
100108

109+
if (_storagePlugin) {
110+
[_storagePlugin cleanUpTask:_channelName handle:_handle];
111+
}
112+
101113
return nil;
102114
}
103115

0 commit comments

Comments
 (0)