diff --git a/GoogleDataTransport.podspec b/GoogleDataTransport.podspec index 11a1a126b9b..eaa36544a0f 100644 --- a/GoogleDataTransport.podspec +++ b/GoogleDataTransport.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'GoogleDataTransport' - s.version = '1.1.0' + s.version = '1.1.1' s.summary = 'Google iOS SDK data transport.' s.description = <<-DESC diff --git a/GoogleDataTransport/GDTLibrary/GDTStorage.m b/GoogleDataTransport/GDTLibrary/GDTStorage.m index ea73f1aebb4..4cf1469fef5 100644 --- a/GoogleDataTransport/GDTLibrary/GDTStorage.m +++ b/GoogleDataTransport/GDTLibrary/GDTStorage.m @@ -246,10 +246,24 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder { - (void)encodeWithCoder:(NSCoder *)aCoder { GDTStorage *sharedInstance = [self.class sharedInstance]; - dispatch_sync(sharedInstance.storageQueue, ^{ - [aCoder encodeObject:sharedInstance->_storedEvents forKey:kGDTStorageStoredEventsKey]; - [aCoder encodeObject:sharedInstance->_targetToEventSet forKey:kGDTStorageTargetToEventSetKey]; - [aCoder encodeObject:sharedInstance->_uploadCoordinator forKey:kGDTStorageUploadCoordinatorKey]; + dispatch_queue_t storageQueue = sharedInstance.storageQueue; + if (!storageQueue) { + return; + } + dispatch_sync(storageQueue, ^{ + NSMutableOrderedSet *storedEvents = sharedInstance->_storedEvents; + if (storedEvents) { + [aCoder encodeObject:storedEvents forKey:kGDTStorageStoredEventsKey]; + } + NSMutableDictionary *> *targetToEventSet = + sharedInstance->_targetToEventSet; + if (targetToEventSet) { + [aCoder encodeObject:targetToEventSet forKey:kGDTStorageTargetToEventSetKey]; + } + GDTUploadCoordinator *uploadCoordinator = sharedInstance->_uploadCoordinator; + if (uploadCoordinator) { + [aCoder encodeObject:uploadCoordinator forKey:kGDTStorageUploadCoordinatorKey]; + } }); } diff --git a/GoogleDataTransport/GDTLibrary/GDTUploadCoordinator.m b/GoogleDataTransport/GDTLibrary/GDTUploadCoordinator.m index afa1e09c70c..8f3df2dda72 100644 --- a/GoogleDataTransport/GDTLibrary/GDTUploadCoordinator.m +++ b/GoogleDataTransport/GDTLibrary/GDTUploadCoordinator.m @@ -208,32 +208,52 @@ - (void)appWillTerminate:(GDTApplication *)application { #pragma mark - GDTUploadPackageProtocol - (void)packageDelivered:(GDTUploadPackage *)package successful:(BOOL)successful { + if (!_coordinationQueue) { + return; + } dispatch_async(_coordinationQueue, ^{ NSNumber *targetNumber = @(package.target); - [self->_targetToInFlightPackages removeObjectForKey:targetNumber]; - id prioritizer = self->_registrar.targetToPrioritizer[targetNumber]; - if (!prioritizer) { - GDTLogError(GDTMCEPrioritizerError, @"A prioritizer should be registered for this target: %@", - targetNumber); + NSMutableDictionary *targetToInFlightPackages = + self->_targetToInFlightPackages; + GDTRegistrar *registrar = self->_registrar; + if (targetToInFlightPackages) { + [targetToInFlightPackages removeObjectForKey:targetNumber]; } - if ([prioritizer respondsToSelector:@selector(packageDelivered:successful:)]) { - [prioritizer packageDelivered:package successful:successful]; + if (registrar) { + id prioritizer = registrar.targetToPrioritizer[targetNumber]; + if (!prioritizer) { + GDTLogError(GDTMCEPrioritizerError, + @"A prioritizer should be registered for this target: %@", targetNumber); + } + if ([prioritizer respondsToSelector:@selector(packageDelivered:successful:)]) { + [prioritizer packageDelivered:package successful:successful]; + } } [self.storage removeEvents:package.events]; }); } - (void)packageExpired:(GDTUploadPackage *)package { + if (!_coordinationQueue) { + return; + } dispatch_async(_coordinationQueue, ^{ NSNumber *targetNumber = @(package.target); - [self->_targetToInFlightPackages removeObjectForKey:targetNumber]; - id prioritizer = self->_registrar.targetToPrioritizer[targetNumber]; - id uploader = self->_registrar.targetToUploader[targetNumber]; - if ([prioritizer respondsToSelector:@selector(packageExpired:)]) { - [prioritizer packageExpired:package]; + NSMutableDictionary *targetToInFlightPackages = + self->_targetToInFlightPackages; + GDTRegistrar *registrar = self->_registrar; + if (targetToInFlightPackages) { + [targetToInFlightPackages removeObjectForKey:targetNumber]; } - if ([uploader respondsToSelector:@selector(packageExpired:)]) { - [uploader packageExpired:package]; + if (registrar) { + id prioritizer = registrar.targetToPrioritizer[targetNumber]; + id uploader = registrar.targetToUploader[targetNumber]; + if ([prioritizer respondsToSelector:@selector(packageExpired:)]) { + [prioritizer packageExpired:package]; + } + if ([uploader respondsToSelector:@selector(packageExpired:)]) { + [uploader packageExpired:package]; + } } }); }