@@ -35,6 +35,8 @@ @interface METSubscriptionManager ()
35
35
36
36
@end
37
37
38
+ NSString * const METSubscriptionManagerErrorDomain = @" com.meteor.SubscriptionManager.ErrorDomain" ;
39
+
38
40
@implementation METSubscriptionManager {
39
41
dispatch_queue_t _queue;
40
42
NSMutableDictionary *_subscriptionsByID;
@@ -97,7 +99,7 @@ - (METSubscription *)existingSubscriptionWithName:(NSString *)name parameters:(N
97
99
return existingSubscription;
98
100
}
99
101
100
- - (void )removeSubscription : (METSubscription *)subscription {
102
+ - (void )removeSubscription : (METSubscription *)subscription immediately : ( BOOL ) immediately completionHandler : (nullable METSubscriptionCompletionHandler) completionHandler {
101
103
NSParameterAssert (subscription);
102
104
103
105
dispatch_async (_queue, ^{
@@ -106,25 +108,40 @@ - (void)removeSubscription:(METSubscription *)subscription {
106
108
if (!subscription.inUse ) {
107
109
[self removeSubscriptionToBeRevivedAfterConnect: subscription];
108
110
109
- if (subscription. reuseTimer == nil ) {
110
- subscription. reuseTimer = [[METTimer alloc ] initWithQueue: _queue block: ^{
111
- // Subscription was reused before timeout
112
- if (subscription.inUse ) {
113
- return ;
114
- }
115
-
116
- [_subscriptionsByID removeObjectForKey: subscription.identifier] ;
117
-
118
- if (_client. connected ) {
119
- [_client sendUnsubMessageForSubscription: subscription ];
120
- }
121
- } ];
111
+ if (immediately ) {
112
+ [ self removeSubscription: subscription completionHandler: completionHandler];
113
+ } else {
114
+ if (subscription.reuseTimer == nil ) {
115
+ subscription. reuseTimer = [[METTimer alloc ] initWithQueue: _queue block: ^{
116
+ // Subscription was reused before timeout
117
+ if (subscription. inUse ) {
118
+ return ;
119
+ }
120
+ [ self removeSubscription: subscription completionHandler: completionHandler];
121
+ } ];
122
+ }
123
+ [subscription.reuseTimer startWithTimeInterval: subscription.notInUseTimeout ];
122
124
}
123
- [subscription.reuseTimer startWithTimeInterval: subscription.notInUseTimeout];
124
125
}
125
126
});
126
127
}
127
128
129
+ - (void )removeSubscription : (METSubscription *)subscription completionHandler : (METSubscriptionCompletionHandler)completionHandler {
130
+ [_subscriptionsByID removeObjectForKey: subscription.identifier];
131
+
132
+ NSError *error = nil ;
133
+
134
+ if (_client.connected ) {
135
+ [_client sendUnsubMessageForSubscription: subscription];
136
+ } else {
137
+ error = [NSError errorWithDomain: METSubscriptionManagerErrorDomain code: 0 userInfo: @{NSLocalizedDescriptionKey : @" Client is not connected" }];
138
+ }
139
+
140
+ if (completionHandler) {
141
+ completionHandler (error);
142
+ }
143
+ }
144
+
128
145
- (void )didReceiveReadyForSubscriptionWithID : (NSString *)subscriptionID {
129
146
NSParameterAssert (subscriptionID);
130
147
0 commit comments