[ios, osx] Secure coding, copying for offline regions

Implemented NSSecureCoding and NSCopying protocols for MGLTilePyramidOfflineRegion so that it can be used more fluidly by client code.
This commit is contained in:
Minh Nguyễn
2016-03-26 21:12:18 -07:00
committed by Minh Nguyễn
parent f02bdb8fbb
commit 4fd875a971
2 changed files with 55 additions and 1 deletions

View File

@@ -9,7 +9,7 @@ NS_ASSUME_NONNULL_BEGIN
An offline region defined by a style URL, geographic coordinate bounds, and
range of zoom levels.
*/
@interface MGLTilePyramidOfflineRegion : NSObject <MGLOfflineRegion>
@interface MGLTilePyramidOfflineRegion : NSObject <MGLOfflineRegion, NSSecureCoding, NSCopying>
/**
URL of the style whose resources are required for offline viewing.

View File

@@ -18,6 +18,10 @@
@synthesize styleURL = _styleURL;
+ (BOOL)supportsSecureCoding {
return YES;
}
- (instancetype)init {
[NSException raise:@"Method unavailable"
format:
@@ -67,4 +71,54 @@
scaleFactor);
}
- (nullable instancetype)initWithCoder:(NSCoder *)coder {
NSURL *styleURL = [coder decodeObjectForKey:@"styleURL"];
CLLocationCoordinate2D sw = CLLocationCoordinate2DMake([coder decodeDoubleForKey:@"southWestLatitude"],
[coder decodeDoubleForKey:@"southWestLongitude"]);
CLLocationCoordinate2D ne = CLLocationCoordinate2DMake([coder decodeDoubleForKey:@"northEastLatitude"],
[coder decodeDoubleForKey:@"northEastLongitude"]);
MGLCoordinateBounds bounds = MGLCoordinateBoundsMake(sw, ne);
double minimumZoomLevel = [coder decodeDoubleForKey:@"minimumZoomLevel"];
double maximumZoomLevel = [coder decodeDoubleForKey:@"maximumZoomLevel"];
return [self initWithStyleURL:styleURL bounds:bounds fromZoomLevel:minimumZoomLevel toZoomLevel:maximumZoomLevel];
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:_styleURL forKey:@"styleURL"];
[coder encodeDouble:_bounds.sw.latitude forKey:@"southWestLatitude"];
[coder encodeDouble:_bounds.sw.longitude forKey:@"southWestLongitude"];
[coder encodeDouble:_bounds.ne.latitude forKey:@"northEastLatitude"];
[coder encodeDouble:_bounds.ne.longitude forKey:@"northEastLongitude"];
[coder encodeDouble:_maximumZoomLevel forKey:@"maximumZoomLevel"];
[coder encodeDouble:_minimumZoomLevel forKey:@"minimumZoomLevel"];
}
- (id)copyWithZone:(nullable NSZone *)zone {
return [[[self class] allocWithZone:zone] initWithStyleURL:_styleURL bounds:_bounds fromZoomLevel:_minimumZoomLevel toZoomLevel:_maximumZoomLevel];
}
- (BOOL)isEqual:(id)other {
if (other == self) {
return YES;
}
if (![other isKindOfClass:[self class]]) {
return NO;
}
MGLTilePyramidOfflineRegion *otherRegion = other;
return (_minimumZoomLevel == otherRegion->_minimumZoomLevel
&& _maximumZoomLevel == otherRegion->_maximumZoomLevel
&& MGLCoordinateBoundsEqualToCoordinateBounds(_bounds, otherRegion->_bounds)
&& [_styleURL isEqual:otherRegion->_styleURL]);
}
- (NSUInteger)hash {
return (_styleURL.hash
+ @(_bounds.sw.latitude).hash + @(_bounds.sw.longitude).hash
+ @(_bounds.ne.latitude).hash + @(_bounds.ne.longitude).hash
+ @(_minimumZoomLevel).hash + @(_maximumZoomLevel).hash);
}
@end