From 38116e39c5832851a585798ab32de3daa03c20e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Mon, 28 Mar 2016 18:06:52 -0700 Subject: [ios, osx] Require progress to be requested manually Requesting progress is expensive, so it is once again computed only on demand, rather than automatically at launch. Moved progress requesting back to iosapp and osxapp. --- platform/darwin/include/MGLOfflinePack.h | 34 ++++++++++++++++------ platform/darwin/src/MGLOfflinePack.mm | 3 +- platform/darwin/src/MGLOfflinePack_Private.h | 12 ++------ platform/darwin/src/MGLOfflineStorage.mm | 3 +- .../ios/app/MBXOfflinePacksTableViewController.m | 7 +++++ platform/osx/app/AppDelegate.m | 12 ++++++++ platform/osx/app/MainMenu.xib | 3 +- 7 files changed, 50 insertions(+), 24 deletions(-) diff --git a/platform/darwin/include/MGLOfflinePack.h b/platform/darwin/include/MGLOfflinePack.h index b65fed3849..783650590a 100644 --- a/platform/darwin/include/MGLOfflinePack.h +++ b/platform/darwin/include/MGLOfflinePack.h @@ -11,9 +11,11 @@ typedef NS_ENUM (NSInteger, MGLOfflinePackState) { /** It is unknown whether the pack is inactive, active, or complete. - This is the initial state of a pack. The state becomes known by the time - the shared `MGLOfflineStorage` object sends its first - `MGLOfflinePackProgressChangedNotification`. + This is the initial state of a pack. The state of a pack becomes known by + the time the shared `MGLOfflineStorage` object sends the first + `MGLOfflinePackProgressChangedNotification` about the pack. For inactive + packs, you must explicitly request a progress update using the + `-[MGLOfflinePack requestProgress]` method. An invalid pack always has a state of `MGLOfflinePackStateInvalid`, never `MGLOfflinePackStateUnknown`. @@ -107,9 +109,10 @@ typedef struct MGLOfflinePackProgress { The pack’s current state. The state of an inactive or completed pack is computed lazily and is set to - `MGLOfflinePackStateUnknown` by default. To get notified when the state becomes - known, observe KVO change notifications on this pack’s `state` key path. - Alternatively, you can add an observer for + `MGLOfflinePackStateUnknown` by default. To request the pack’s status, use the + `-requestProgress` method. To get notified when the state becomes known and + when it changes, observe KVO change notifications on this pack’s `state` key + path. Alternatively, you can add an observer for `MGLOfflinePackProgressChangedNotification`s about this pack that come from the default notification center. */ @@ -119,9 +122,10 @@ typedef struct MGLOfflinePackProgress { The pack’s current progress. The progress of an inactive or completed pack is computed lazily, and all its - fields are set to 0 by default. To get notified when the progress becomes - known, observe KVO change notifications on this pack’s `state` key path. - Alternatively, you can add an observer for + fields are set to 0 by default. To request the pack’s progress, use the + `-requestProgress` method. To get notified when the progress becomes + known and when it changes, observe KVO change notifications on this pack’s + `state` key path. Alternatively, you can add an observer for `MGLOfflinePackProgressChangedNotification`s about this pack that come from the default notification center. */ @@ -159,6 +163,18 @@ typedef struct MGLOfflinePackProgress { */ - (void)suspend; +/** + Request an asynchronous update to the pack’s `state` and `progress` properties. + + The state and progress of an inactive or completed pack are computed lazily. If + you need the state or progress of a pack whose `state` property is currently + set to `MGLOfflinePackStateUnknown`, observe KVO change notifications on this + pack’s `state` key path, then call this method. Alternatively, you can add an + observer for `MGLOfflinePackProgressChangedNotification` about this pack that + come from the default notification center. + */ +- (void)requestProgress; + @end /** diff --git a/platform/darwin/src/MGLOfflinePack.mm b/platform/darwin/src/MGLOfflinePack.mm index 05ff35ec7f..9775f1cfca 100644 --- a/platform/darwin/src/MGLOfflinePack.mm +++ b/platform/darwin/src/MGLOfflinePack.mm @@ -40,7 +40,6 @@ private: @property (nonatomic, weak, nullable) id delegate; @property (nonatomic, nullable, readwrite) mbgl::OfflineRegion *mbglOfflineRegion; -@property (nonatomic, readwrite) MGLOfflinePackState state; @property (nonatomic, readwrite) MGLOfflinePackProgress progress; @end @@ -123,7 +122,7 @@ private: } - (void)requestProgress { - NSAssert(_state != MGLOfflinePackStateInvalid, @"Cannot request progress from an invalid offline pack."); + MGLAssertOfflinePackIsValid(); mbgl::DefaultFileSource *mbglFileSource = [[MGLOfflineStorage sharedOfflineStorage] mbglFileSource]; diff --git a/platform/darwin/src/MGLOfflinePack_Private.h b/platform/darwin/src/MGLOfflinePack_Private.h index 0e92655406..95d8ba4323 100644 --- a/platform/darwin/src/MGLOfflinePack_Private.h +++ b/platform/darwin/src/MGLOfflinePack_Private.h @@ -19,17 +19,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, nullable) mbgl::OfflineRegion *mbglOfflineRegion; -- (instancetype)initWithMBGLRegion:(mbgl::OfflineRegion *)region; +@property (nonatomic, readwrite) MGLOfflinePackState state; -/** - Request an asynchronous update to the pack’s `state` and `progress` properties. - - The state and progress of an inactive or completed pack are computed lazily. If - you need the state or progress of a pack inside an - `MGLOfflinePackListingCompletionHandler`, set the `delegate` property then call - this method. - */ -- (void)requestProgress; +- (instancetype)initWithMBGLRegion:(mbgl::OfflineRegion *)region; /** Invalidates the pack and ensures that no future progress update can ever diff --git a/platform/darwin/src/MGLOfflineStorage.mm b/platform/darwin/src/MGLOfflineStorage.mm index 3d171ca203..89bf050249 100644 --- a/platform/darwin/src/MGLOfflineStorage.mm +++ b/platform/darwin/src/MGLOfflineStorage.mm @@ -130,10 +130,10 @@ NSString * const MGLOfflinePackMaximumCountUserInfoKey = @"MaximumCount"; - (void)addPackForRegion:(id )region withContext:(NSData *)context completionHandler:(MGLOfflinePackAdditionCompletionHandler)completion { __weak MGLOfflineStorage *weakSelf = self; [self _addPackForRegion:region withContext:context completionHandler:^(MGLOfflinePack * _Nullable pack, NSError * _Nullable error) { + pack.state = MGLOfflinePackStateInactive; MGLOfflineStorage *strongSelf = weakSelf; [[strongSelf mutableArrayValueForKey:@"packs"] addObject:pack]; pack.delegate = strongSelf; - [pack requestProgress]; if (completion) { completion(pack, error); } @@ -208,7 +208,6 @@ NSString * const MGLOfflinePackMaximumCountUserInfoKey = @"MaximumCount"; for (MGLOfflinePack *pack in packs) { pack.delegate = self; - [pack requestProgress]; } }]; } diff --git a/platform/ios/app/MBXOfflinePacksTableViewController.m b/platform/ios/app/MBXOfflinePacksTableViewController.m index f4a2917d60..8aad4fbbf8 100644 --- a/platform/ios/app/MBXOfflinePacksTableViewController.m +++ b/platform/ios/app/MBXOfflinePacksTableViewController.m @@ -70,6 +70,13 @@ static NSString * const MBXOfflinePacksTableViewActiveCellReuseIdentifier = @"Ac default: [self.tableView reloadData]; + + for (MGLOfflinePack *pack in [MGLOfflineStorage sharedOfflineStorage].packs) { + if (pack.state == MGLOfflinePackStateUnknown) { + [pack requestProgress]; + } + } + break; } } else { diff --git a/platform/osx/app/AppDelegate.m b/platform/osx/app/AppDelegate.m index 186a3a1ab3..d9fd967410 100644 --- a/platform/osx/app/AppDelegate.m +++ b/platform/osx/app/AppDelegate.m @@ -58,6 +58,7 @@ NSString * const MGLLastMapDebugMaskDefaultsKey = @"MGLLastMapDebugMask"; @interface AppDelegate () @property (weak) IBOutlet NSArrayController *offlinePacksArrayController; +@property (weak) IBOutlet NSPanel *offlinePacksPanel; @end @@ -177,6 +178,14 @@ NSString * const MGLLastMapDebugMaskDefaultsKey = @"MGLLastMapDebugMask"; #pragma mark Offline pack management +- (IBAction)showOfflinePacksPanel:(id)sender { + [self.offlinePacksPanel makeKeyAndOrderFront:sender]; + + for (MGLOfflinePack *pack in self.offlinePacksArrayController.arrangedObjects) { + [pack requestProgress]; + } +} + - (IBAction)delete:(id)sender { for (MGLOfflinePack *pack in self.offlinePacksArrayController.selectedObjects) { [[MGLOfflineStorage sharedOfflineStorage] removePack:pack withCompletionHandler:^(NSError * _Nullable error) { @@ -247,6 +256,9 @@ NSString * const MGLLastMapDebugMaskDefaultsKey = @"MGLLastMapDebugMask"; if (menuItem.action == @selector(showPreferences:)) { return YES; } + if (menuItem.action == @selector(showOfflinePacksPanel:)) { + return YES; + } if (menuItem.action == @selector(delete:)) { return self.offlinePacksArrayController.selectedObjects.count; } diff --git a/platform/osx/app/MainMenu.xib b/platform/osx/app/MainMenu.xib index c408bdc568..646c4ae40d 100644 --- a/platform/osx/app/MainMenu.xib +++ b/platform/osx/app/MainMenu.xib @@ -18,6 +18,7 @@ + @@ -527,7 +528,7 @@ - + -- cgit v1.2.1