* init, load, persist, sync, clear * clean up frequent disk syncs which impacted iOS performance * insert disk sync into various iOS/OS X lifecycle events * implement clear * implement save on iOS * cleaner dictionary syntax
This commit is contained in:
@@ -7,16 +7,17 @@ namespace llmr {
|
||||
|
||||
class Settings : private util::noncopyable {
|
||||
public:
|
||||
virtual void save() = 0;
|
||||
virtual void load() = 0; // load into memory
|
||||
virtual void persist() = 0; // persist in memory (then call sync() if platform-appropriate)
|
||||
virtual void sync() = 0; // save to disk
|
||||
virtual void clear() = 0; // clear from memory and disk
|
||||
virtual ~Settings() {}
|
||||
public:
|
||||
// position
|
||||
double longitude = 0;
|
||||
double latitude = 0;
|
||||
double scale = 0;
|
||||
double angle = 0;
|
||||
|
||||
// debug
|
||||
bool debug = false;
|
||||
};
|
||||
|
||||
|
||||
@@ -14,8 +14,9 @@ namespace llmr
|
||||
{
|
||||
public:
|
||||
Settings_iOS();
|
||||
virtual void save();
|
||||
virtual void load();
|
||||
virtual void persist();
|
||||
virtual void sync();
|
||||
virtual void clear();
|
||||
};
|
||||
}
|
||||
@@ -12,57 +12,41 @@
|
||||
|
||||
using namespace llmr;
|
||||
|
||||
Settings_iOS::Settings_iOS() {
|
||||
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
|
||||
// position
|
||||
[NSNumber numberWithDouble:longitude], @"longitude",
|
||||
[NSNumber numberWithDouble:latitude], @"latitude",
|
||||
[NSNumber numberWithDouble:scale], @"scale",
|
||||
[NSNumber numberWithDouble:angle], @"angle",
|
||||
|
||||
// debug
|
||||
[NSNumber numberWithBool:debug], @"debug",
|
||||
|
||||
nil
|
||||
];
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
|
||||
Settings_iOS::Settings_iOS()
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"longitude" : @(longitude),
|
||||
@"latitude" : @(latitude),
|
||||
@"scale" : @(scale),
|
||||
@"angle" : @(angle),
|
||||
@"debug" : @(debug) }];
|
||||
}
|
||||
|
||||
void Settings_iOS::load() {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
void Settings_iOS::load()
|
||||
{
|
||||
NSDictionary *settings = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
|
||||
|
||||
// position
|
||||
longitude = [defaults doubleForKey:@"longitude"];
|
||||
latitude = [defaults doubleForKey:@"latitude"];
|
||||
scale = [defaults doubleForKey:@"scale"];
|
||||
angle = [defaults doubleForKey:@"angle"];
|
||||
|
||||
// debug
|
||||
debug = [defaults boolForKey:@"debug"];
|
||||
longitude = [settings[@"longitude"] doubleValue];
|
||||
latitude = [settings[@"latitude"] doubleValue];
|
||||
scale = [settings[@"scale"] doubleValue];
|
||||
angle = [settings[@"angle"] doubleValue];
|
||||
debug = [settings[@"debug"] boolValue];
|
||||
}
|
||||
|
||||
void Settings_iOS::save() {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
|
||||
// position
|
||||
[NSNumber numberWithDouble:longitude], @"longitude",
|
||||
[NSNumber numberWithDouble:latitude], @"latitude",
|
||||
[NSNumber numberWithDouble:scale], @"scale",
|
||||
[NSNumber numberWithDouble:angle], @"angle",
|
||||
|
||||
// debug
|
||||
[NSNumber numberWithBool:debug], @"debug",
|
||||
|
||||
nil
|
||||
];
|
||||
// [defaults setPersistentDomain:appDefaults forName:[[NSBundle mainBundle] bundleIdentifier]];
|
||||
|
||||
// [defaults synchronize];
|
||||
void Settings_iOS::persist()
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setValuesForKeysWithDictionary:@{ @"longitude" : @(longitude),
|
||||
@"latitude" : @(latitude),
|
||||
@"scale" : @(scale),
|
||||
@"angle" : @(angle),
|
||||
@"debug" : @(debug) }];
|
||||
}
|
||||
|
||||
void Settings_iOS::clear() {
|
||||
void Settings_iOS::sync()
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] synchronize];
|
||||
}
|
||||
|
||||
void Settings_iOS::clear()
|
||||
{
|
||||
[NSUserDefaults resetStandardUserDefaults];
|
||||
}
|
||||
@@ -139,6 +139,11 @@ class MBXMapView
|
||||
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
mapView->settings.sync();
|
||||
}
|
||||
|
||||
- (void)updateRender:(NSNotification *)notification
|
||||
{
|
||||
[self updateRender];
|
||||
@@ -165,6 +170,8 @@ class MBXMapView
|
||||
- (void)pauseRender
|
||||
{
|
||||
displayLink.paused = YES;
|
||||
|
||||
mapView->settings.sync();
|
||||
}
|
||||
|
||||
- (void)render:(id)sender
|
||||
|
||||
@@ -267,6 +267,7 @@ int main() {
|
||||
mapView = new MapView();
|
||||
mapView->init();
|
||||
int ret = mapView->run();
|
||||
mapView->settings.sync();
|
||||
delete mapView;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -8,8 +8,9 @@ namespace llmr {
|
||||
class Settings_MacOSX : public Settings {
|
||||
public:
|
||||
Settings_MacOSX();
|
||||
virtual void save();
|
||||
virtual void load();
|
||||
virtual void persist();
|
||||
virtual void sync();
|
||||
virtual void clear();
|
||||
};
|
||||
|
||||
|
||||
@@ -2,60 +2,43 @@
|
||||
|
||||
#include "settings.hpp"
|
||||
|
||||
|
||||
using namespace llmr;
|
||||
|
||||
Settings_MacOSX::Settings_MacOSX() {
|
||||
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
|
||||
// position
|
||||
[NSNumber numberWithDouble:longitude], @"longitude",
|
||||
[NSNumber numberWithDouble:latitude], @"latitude",
|
||||
[NSNumber numberWithDouble:scale], @"scale",
|
||||
[NSNumber numberWithDouble:angle], @"angle",
|
||||
|
||||
// debug
|
||||
[NSNumber numberWithBool:debug], @"debug",
|
||||
|
||||
nil
|
||||
];
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
|
||||
Settings_MacOSX::Settings_MacOSX()
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"longitude" : @(longitude),
|
||||
@"latitude" : @(latitude),
|
||||
@"scale" : @(scale),
|
||||
@"angle" : @(angle),
|
||||
@"debug" : @(debug) }];
|
||||
}
|
||||
|
||||
void Settings_MacOSX::load() {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
void Settings_MacOSX::load()
|
||||
{
|
||||
NSDictionary *settings = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
|
||||
|
||||
// position
|
||||
longitude = [defaults doubleForKey:@"longitude"];
|
||||
latitude = [defaults doubleForKey:@"latitude"];
|
||||
scale = [defaults doubleForKey:@"scale"];
|
||||
angle = [defaults doubleForKey:@"angle"];
|
||||
|
||||
// debug
|
||||
debug = [defaults boolForKey:@"debug"];
|
||||
longitude = [settings[@"longitude"] doubleValue];
|
||||
latitude = [settings[@"latitude"] doubleValue];
|
||||
scale = [settings[@"scale"] doubleValue];
|
||||
angle = [settings[@"angle"] doubleValue];
|
||||
debug = [settings[@"debug"] boolValue];
|
||||
}
|
||||
|
||||
void Settings_MacOSX::save() {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
|
||||
// position
|
||||
[NSNumber numberWithDouble:longitude], @"longitude",
|
||||
[NSNumber numberWithDouble:latitude], @"latitude",
|
||||
[NSNumber numberWithDouble:scale], @"scale",
|
||||
[NSNumber numberWithDouble:angle], @"angle",
|
||||
|
||||
// debug
|
||||
[NSNumber numberWithBool:debug], @"debug",
|
||||
|
||||
nil
|
||||
];
|
||||
[defaults setPersistentDomain:appDefaults forName:[[NSBundle mainBundle] bundleIdentifier]];
|
||||
|
||||
[defaults synchronize];
|
||||
void Settings_MacOSX::persist()
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setValuesForKeysWithDictionary:@{ @"longitude" : @(longitude),
|
||||
@"latitude" : @(latitude),
|
||||
@"scale" : @(scale),
|
||||
@"angle" : @(angle),
|
||||
@"debug" : @(debug) }];
|
||||
}
|
||||
|
||||
void Settings_MacOSX::clear() {
|
||||
void Settings_MacOSX::sync()
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] synchronize];
|
||||
}
|
||||
|
||||
void Settings_MacOSX::clear()
|
||||
{
|
||||
[NSUserDefaults resetStandardUserDefaults];
|
||||
}
|
||||
@@ -22,6 +22,7 @@ Map::Map(Settings& settings)
|
||||
}
|
||||
|
||||
Map::~Map() {
|
||||
settings.sync();
|
||||
}
|
||||
|
||||
void Map::setup() {
|
||||
@@ -62,7 +63,7 @@ void Map::moveBy(double dx, double dy, double duration) {
|
||||
update();
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::scaleBy(double ds, double cx, double cy, double duration) {
|
||||
@@ -72,7 +73,7 @@ void Map::scaleBy(double ds, double cx, double cy, double duration) {
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.scale = transform.getScale();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration) {
|
||||
@@ -80,7 +81,7 @@ void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double
|
||||
update();
|
||||
|
||||
settings.angle = transform.getAngle();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::setLonLat(double lon, double lat, double duration) {
|
||||
@@ -88,7 +89,7 @@ void Map::setLonLat(double lon, double lat, double duration) {
|
||||
update();
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::getLonLat(double &lon, double &lat) const {
|
||||
@@ -102,7 +103,7 @@ void Map::setLonLatZoom(double lon, double lat, double zoom, double duration) {
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.scale = transform.getScale();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::getLonLatZoom(double &lon, double &lat, double &zoom) const {
|
||||
@@ -116,7 +117,7 @@ void Map::setScale(double scale, double cx, double cy, double duration) {
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.scale = transform.getScale();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::setZoom(double zoom, double duration) {
|
||||
@@ -126,7 +127,7 @@ void Map::setZoom(double zoom, double duration) {
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.scale = transform.getScale();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
double Map::getZoom() const {
|
||||
@@ -152,7 +153,7 @@ void Map::setAngle(double angle, double x, double y, double duration) {
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.angle = transform.getAngle();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
double Map::getScale() const {
|
||||
@@ -168,7 +169,7 @@ void Map::resetNorth() {
|
||||
update();
|
||||
|
||||
settings.angle = transform.getAngle();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::resetPosition() {
|
||||
@@ -181,7 +182,7 @@ void Map::resetPosition() {
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.scale = transform.getScale();
|
||||
settings.angle = transform.getAngle();
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::resetZoom() {
|
||||
@@ -192,7 +193,7 @@ void Map::toggleDebug() {
|
||||
settings.debug = !settings.debug;
|
||||
update();
|
||||
|
||||
settings.save();
|
||||
settings.persist();
|
||||
}
|
||||
|
||||
void Map::cancelAnimations() {
|
||||
|
||||
Reference in New Issue
Block a user