From 7b0881030fdc60130458c2a798de696888c87c7c Mon Sep 17 00:00:00 2001 From: Eimantas Vaiciunas Date: Mon, 6 Feb 2017 15:47:39 +0200 Subject: [PATCH] Make `MGLOfflinePack` instances post notifications This commit also gets rid of private `MGLOfflinePackDelegate` protocol. `userInfo` dictionary in notification objects retain the `state` and `progress` values for backwards compatibility. They can be removed in later major release. --- platform/darwin/src/MGLOfflinePack.mm | 31 +++++++++-- platform/darwin/src/MGLOfflinePack_Private.h | 54 -------------------- platform/darwin/src/MGLOfflineStorage.mm | 28 +--------- platform/ios/CHANGELOG.md | 1 + platform/macos/CHANGELOG.md | 1 + 5 files changed, 30 insertions(+), 85 deletions(-) diff --git a/platform/darwin/src/MGLOfflinePack.mm b/platform/darwin/src/MGLOfflinePack.mm index 218e32940db..60a7b555313 100644 --- a/platform/darwin/src/MGLOfflinePack.mm +++ b/platform/darwin/src/MGLOfflinePack.mm @@ -4,6 +4,8 @@ #import "MGLOfflineRegion_Private.h" #import "MGLTilePyramidOfflineRegion.h" +#import "NSValue+MGLAdditions.h" + #include /** @@ -37,7 +39,6 @@ @interface MGLOfflinePack () -@property (nonatomic, weak, nullable) id delegate; @property (nonatomic, nullable, readwrite) mbgl::OfflineRegion *mbglOfflineRegion; @property (nonatomic, readwrite) MGLOfflinePackProgress progress; @@ -175,7 +176,29 @@ - (void)offlineRegionStatusDidChange:(mbgl::OfflineRegionStatus)status { progress.maximumResourcesExpected = status.requiredResourceCountIsPrecise ? status.requiredResourceCount : UINT64_MAX; self.progress = progress; - [self.delegate offlinePack:self progressDidChange:progress]; + NSDictionary *userInfo = @{MGLOfflinePackUserInfoKeyState: @(self.state), + MGLOfflinePackUserInfoKeyProgress: [NSValue valueWithMGLOfflinePackProgress:progress]}; + + NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter]; + [noteCenter postNotificationName:MGLOfflinePackProgressChangedNotification + object:self + userInfo:userInfo]; +} + +- (void)didReceiveError:(NSError *)error { + NSDictionary *userInfo = @{ MGLOfflinePackUserInfoKeyError: error }; + NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter]; + [noteCenter postNotificationName:MGLOfflinePackErrorNotification + object:self + userInfo:userInfo]; +} + +- (void)didReceiveMaximumAllowedMapboxTiles:(uint64_t)limit { + NSDictionary *userInfo = @{ MGLOfflinePackUserInfoKeyMaximumCount: @(limit) }; + NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter]; + [noteCenter postNotificationName:MGLOfflinePackMaximumMapboxTilesReachedNotification + object:self + userInfo:userInfo]; } NSError *MGLErrorFromResponseError(mbgl::Response::Error error) { @@ -211,12 +234,12 @@ - (void)offlineRegionStatusDidChange:(mbgl::OfflineRegionStatus)status { void MBGLOfflineRegionObserver::responseError(mbgl::Response::Error error) { dispatch_async(dispatch_get_main_queue(), ^{ - [pack.delegate offlinePack:pack didReceiveError:MGLErrorFromResponseError(error)]; + [pack didReceiveError:MGLErrorFromResponseError(error)]; }); } void MBGLOfflineRegionObserver::mapboxTileCountLimitExceeded(uint64_t limit) { dispatch_async(dispatch_get_main_queue(), ^{ - [pack.delegate offlinePack:pack didReceiveMaximumAllowedMapboxTiles:limit]; + [pack didReceiveMaximumAllowedMapboxTiles:limit]; }); } diff --git a/platform/darwin/src/MGLOfflinePack_Private.h b/platform/darwin/src/MGLOfflinePack_Private.h index 65156b4e90b..8a63152dcac 100644 --- a/platform/darwin/src/MGLOfflinePack_Private.h +++ b/platform/darwin/src/MGLOfflinePack_Private.h @@ -4,19 +4,8 @@ NS_ASSUME_NONNULL_BEGIN -@protocol MGLOfflinePackDelegate; - @interface MGLOfflinePack (Private) -/** - The pack’s delegate. - - You can use the offline pack delegate to be notified of any changes in the - pack’s progress and of any errors while downloading. For more information, see - the `MGLOfflinePackDelegate` documentation. - */ -@property (nonatomic, weak, nullable) id delegate; - @property (nonatomic, nullable) mbgl::OfflineRegion *mbglOfflineRegion; @property (nonatomic, readwrite) MGLOfflinePackState state; @@ -31,47 +20,4 @@ NS_ASSUME_NONNULL_BEGIN @end -/** - The `MGLOfflinePackDelegate` protocol defines methods that a delegate of an - `MGLOfflinePack` object can optionally implement to be notified of any changes - in the pack’s download progress and of any errors while downloading. - */ -@protocol MGLOfflinePackDelegate - -/** - Sent whenever the pack’s state or download progress changes. Every change to a - field in the `progress` property corresponds to an invocation of this method. - - @param pack The pack whose state of progress changed. - @param progress The updated progress. To get the updated state, refer to the - `state` property. - */ -- (void)offlinePack:(MGLOfflinePack *)pack progressDidChange:(MGLOfflinePackProgress)progress; - -/** - Sent whenever the pack encounters an error while downloading. - - Download errors may be recoverable. For example, this pack’s implementation may - attempt to re-request failed resources based on an exponential backoff - strategy or upon the restoration of network access. - - @param pack The pack that encountered an error. - @param error A download error. For a list of possible error codes, see - `MGLErrorCode`. - */ -- (void)offlinePack:(MGLOfflinePack *)pack didReceiveError:(NSError *)error; - -/** - Sent when the maximum number of Mapbox-hosted tiles has been downloaded and - stored on the current device. - - Once this limit is reached, no instance of `MGLOfflinePack` can download - additional tiles from Mapbox APIs until already downloaded tiles are removed by - calling the `-[MGLOfflineStorage removePack:withCompletionHandler:]` method. - Contact your Mapbox sales representative to have the limit raised. - */ -- (void)offlinePack:(MGLOfflinePack *)pack didReceiveMaximumAllowedMapboxTiles:(uint64_t)maximumCount; - -@end - NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MGLOfflineStorage.mm b/platform/darwin/src/MGLOfflineStorage.mm index bdecd101d21..af0f5929024 100644 --- a/platform/darwin/src/MGLOfflineStorage.mm +++ b/platform/darwin/src/MGLOfflineStorage.mm @@ -26,7 +26,7 @@ const MGLOfflinePackUserInfoKey MGLOfflinePackUserInfoKeyMaximumCount = @"MaximumCount"; NSString * const MGLOfflinePackMaximumCountUserInfoKey = MGLOfflinePackUserInfoKeyMaximumCount; -@interface MGLOfflineStorage () +@interface MGLOfflineStorage () @property (nonatomic, strong, readwrite) NS_MUTABLE_ARRAY_OF(MGLOfflinePack *) *packs; @property (nonatomic) mbgl::DefaultFileSource *mbglFileSource; @@ -197,7 +197,6 @@ - (void)addPackForRegion:(id )region withContext:(NSData *)con pack.state = MGLOfflinePackStateInactive; MGLOfflineStorage *strongSelf = weakSelf; [[strongSelf mutableArrayValueForKey:@"packs"] addObject:pack]; - pack.delegate = strongSelf; if (completion) { completion(pack, error); } @@ -269,10 +268,6 @@ - (void)reloadPacks { [pack invalidate]; } self.packs = [packs mutableCopy]; - - for (MGLOfflinePack *pack in packs) { - pack.delegate = self; - } }]; } @@ -317,25 +312,4 @@ - (unsigned long long)countOfBytesCompleted { return attributes.fileSize; } -#pragma mark MGLOfflinePackDelegate methods - -- (void)offlinePack:(MGLOfflinePack *)pack progressDidChange:(__unused MGLOfflinePackProgress)progress { - [[NSNotificationCenter defaultCenter] postNotificationName:MGLOfflinePackProgressChangedNotification object:pack userInfo:@{ - MGLOfflinePackUserInfoKeyState: @(pack.state), - MGLOfflinePackUserInfoKeyProgress: [NSValue valueWithMGLOfflinePackProgress:progress], - }]; -} - -- (void)offlinePack:(MGLOfflinePack *)pack didReceiveError:(NSError *)error { - [[NSNotificationCenter defaultCenter] postNotificationName:MGLOfflinePackErrorNotification object:pack userInfo:@{ - MGLOfflinePackUserInfoKeyError: error, - }]; -} - -- (void)offlinePack:(MGLOfflinePack *)pack didReceiveMaximumAllowedMapboxTiles:(uint64_t)maximumCount { - [[NSNotificationCenter defaultCenter] postNotificationName:MGLOfflinePackMaximumMapboxTilesReachedNotification object:pack userInfo:@{ - MGLOfflinePackUserInfoKeyMaximumCount: @(maximumCount), - }]; -} - @end diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md index 980a609483c..9f0bc3af1c8 100644 --- a/platform/ios/CHANGELOG.md +++ b/platform/ios/CHANGELOG.md @@ -24,6 +24,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT ### Other changes +* `MGLOfflinePack` and `MGLOfflineStorage` now conform to standard notification posting patterns. Notifications are posted by `MGLOfflinePack` instances. `userInfo` dictionary still contains values with pack's `state` and `progress` properties for backwards compatibility. ([#7952](https://github.com/mapbox/mapbox-gl-native/pull/7952)) * Fixed an issue where translucent, non-view-backed point annotations along tile boundaries would be drawn darker than expected. ([#6832](https://github.com/mapbox/mapbox-gl-native/pull/6832)) * Fixed flickering that occurred when panning past the antimeridian. ([#7574](https://github.com/mapbox/mapbox-gl-native/pull/7574)) * Fixed an issue that could prevent a cached style from appearing while the device is offline. ([#7770](https://github.com/mapbox/mapbox-gl-native/pull/7770)) diff --git a/platform/macos/CHANGELOG.md b/platform/macos/CHANGELOG.md index e04ba3ced57..0e68a50e217 100644 --- a/platform/macos/CHANGELOG.md +++ b/platform/macos/CHANGELOG.md @@ -22,6 +22,7 @@ ### Other changes +* `MGLOfflinePack` and `MGLOfflineStorage` now conform to standard notification posting patterns. Notifications are posted by `MGLOfflinePack` instances. `userInfo` dictionary still contains values with pack's `state` and `progress` properties for backwards compatibility. ([#7952](https://github.com/mapbox/mapbox-gl-native/pull/7952)) * Fixed an issue where translucent point annotations along tile boundaries would be drawn darker than expected. ([#6832](https://github.com/mapbox/mapbox-gl-native/pull/6832)) * Fixed flickering that occurred when panning past the antimeridian. ([#7574](https://github.com/mapbox/mapbox-gl-native/pull/7574)) * Fixed an issue that could prevent a cached style from appearing while the computer is offline. ([#7770](https://github.com/mapbox/mapbox-gl-native/pull/7770))