Skip to content

Commit

Permalink
Begin switching to Alamofire. Fixes #29
Browse files Browse the repository at this point in the history
  • Loading branch information
tmcw committed Apr 7, 2016
1 parent a939747 commit 34b9799
Show file tree
Hide file tree
Showing 7 changed files with 104 additions and 125 deletions.
2 changes: 1 addition & 1 deletion MapboxDirections.swift.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ Pod::Spec.new do |s|
s.module_name = "MapboxDirections"

# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
s.dependency "NBNRequestKit"
s.dependency "Alamofire", "~> 3.0"
s.dependency "Polyline", "~> 3.0"

end
16 changes: 12 additions & 4 deletions MapboxDirections.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
8543D22E59F4F058585E18B9 /* Pods_MapboxDirectionsTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72B856631C2DD5B041A03A48 /* Pods_MapboxDirectionsTests.framework */; };
910EA7231CB5734F00858D31 /* driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = 910EA7221CB5734F00858D31 /* driving_dc_polyline.json */; };
9151CBAA1CB5A36C006CF17B /* Polyline.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 910EA7241CB5917000858D31 /* Polyline.framework */; };
9151CBAC1CB5C295006CF17B /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9151CBAB1CB5C295006CF17B /* Alamofire.framework */; };
BB44F9743C24BD97DFD53E9F /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 779CA65749150F5A75B46628 /* Pods.framework */; };
DA2133B21CAEEE3200AA2594 /* RequestKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA2133B11CAEEE3200AA2594 /* RequestKit.framework */; };
DA2133B31CAEEFE100AA2594 /* MapboxDirections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */; };
DA2E03E91CB0E0B000D1269A /* MBDirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* MBDirectionsResponse.swift */; };
DA2E03EB1CB0E13D00D1269A /* MBDirectionsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* MBDirectionsRequest.swift */; };
Expand Down Expand Up @@ -59,10 +59,10 @@
78F47212D6DC575EFAC36509 /* Pods-MapboxDirectionsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MapboxDirectionsTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-MapboxDirectionsTests/Pods-MapboxDirectionsTests.release.xcconfig"; sourceTree = "<group>"; };
910EA7221CB5734F00858D31 /* driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = driving_dc_polyline.json; sourceTree = "<group>"; };
910EA7241CB5917000858D31 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = "../../Library/Developer/Xcode/DerivedData/MapboxDirections-cxcrsxhcoorbtxaohfcuxrgxzrsg/Build/Products/Debug-iphonesimulator/Polyline.framework"; sourceTree = "<group>"; };
9151CBAB1CB5C295006CF17B /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = "Pods/../build/Debug-iphoneos/Alamofire.framework"; sourceTree = "<group>"; };
A338BDE4A863FFF749998470 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
B2FF88ACFEC9E7E276EF93DA /* Pods-MapboxDirectionsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MapboxDirectionsTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MapboxDirectionsTests/Pods-MapboxDirectionsTests.debug.xcconfig"; sourceTree = "<group>"; };
D4657820F4366F9DB1C432FB /* Pods-Unit Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Unit Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Unit Tests/Pods-Unit Tests.debug.xcconfig"; sourceTree = "<group>"; };
DA2133B11CAEEE3200AA2594 /* RequestKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RequestKit.framework; path = "Pods/../build/Debug-iphoneos/RequestKit.framework"; sourceTree = "<group>"; };
DA2E03E81CB0E0B000D1269A /* MBDirectionsResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBDirectionsResponse.swift; sourceTree = "<group>"; };
DA2E03EA1CB0E13D00D1269A /* MBDirectionsRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBDirectionsRequest.swift; sourceTree = "<group>"; };
DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MapboxDirections.framework; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -90,8 +90,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9151CBAC1CB5C295006CF17B /* Alamofire.framework in Frameworks */,
9151CBAA1CB5A36C006CF17B /* Polyline.framework in Frameworks */,
DA2133B21CAEEE3200AA2594 /* RequestKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -119,8 +119,8 @@
4025371970E36C6D8BF67116 /* Frameworks */ = {
isa = PBXGroup;
children = (
9151CBAB1CB5C295006CF17B /* Alamofire.framework */,
910EA7241CB5917000858D31 /* Polyline.framework */,
DA2133B11CAEEE3200AA2594 /* RequestKit.framework */,
371BFE7855E3EA8B44CA2B5F /* Pods_Unit_Tests.framework */,
779CA65749150F5A75B46628 /* Pods.framework */,
72B856631C2DD5B041A03A48 /* Pods_MapboxDirectionsTests.framework */,
Expand Down Expand Up @@ -531,6 +531,10 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/build/Debug-iphoneos",
);
INFOPLIST_FILE = MapboxDirections/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
Expand All @@ -551,6 +555,10 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/build/Debug-iphoneos",
);
INFOPLIST_FILE = MapboxDirections/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
Expand Down
31 changes: 10 additions & 21 deletions MapboxDirections/MBDirections.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import Alamofire
import CoreLocation

public typealias MBDirectionsHandler = (MBDirectionsResponse?, NSError?) -> Void
Expand Down Expand Up @@ -36,10 +37,7 @@ public class MBDirections: NSObject {

private let request: MBDirectionsRequest
private let configuration: MBDirectionsConfiguration
private var task: NSURLSessionDataTask?
public var calculating: Bool {
return task?.state == .Running
}
private var task: Request?

private var errorForSimultaneousRequests: NSError {
let userInfo = [
Expand All @@ -55,10 +53,6 @@ public class MBDirections: NSObject {
}

public func calculateDirectionsWithCompletionHandler(completionHandler: MBDirectionsHandler) {
guard !calculating else {
completionHandler(nil, errorForSimultaneousRequests)
return
}

var profileIdentifier = request.profileIdentifier
let version = request.version
Expand All @@ -82,10 +76,6 @@ public class MBDirections: NSObject {
}

public func calculateETAWithCompletionHandler(completionHandler: MBETAHandler) {
guard !calculating else {
completionHandler(nil, errorForSimultaneousRequests)
return
}

let router: MBDirectionsRouter
switch request.version {
Expand Down Expand Up @@ -122,15 +112,15 @@ public class MBDirections: NSObject {
[MBDirectionsWaypoint(coordinate: request.destinationCoordinate, accuracy: nil, heading: nil)]].flatMap{ $0 }
}

private func taskWithRouter(router: MBDirectionsRouter, completionHandler completion: (MBPoint, [MBPoint], MBPoint, [JSON], NSError?) -> Void, errorHandler: (NSError?) -> Void) -> NSURLSessionDataTask? {
return router.loadJSON(JSON.self) { [weak self] (json, error) in
guard let dataTaskSelf = self where dataTaskSelf.task?.state == .Completed else {
return
}
private func taskWithRouter(router: MBDirectionsRouter, completionHandler completion: (MBPoint, [MBPoint], MBPoint, [JSON], NSError?) -> Void, errorHandler: (NSError?) -> Void) -> Request? {
let request = Alamofire.request(router).responseJSON { response in

let error = response.result.error
let json = response.result.value

guard error == nil && json != nil else {
dispatch_sync(dispatch_get_main_queue()) {
errorHandler(error as? NSError)
errorHandler(error)
}
return
}
Expand Down Expand Up @@ -195,10 +185,9 @@ public class MBDirections: NSObject {
var waypoints = points.suffixFrom(1)
waypoints = waypoints.prefixUpTo(waypoints.count)

dispatch_sync(dispatch_get_main_queue()) {
completion(source, Array(waypoints), destination, routes, error as? NSError)
}
completion(source, Array(waypoints), destination, routes, error)
}
return request
}

public func cancel() {
Expand Down
5 changes: 2 additions & 3 deletions MapboxDirections/MBDirectionsConfiguration.swift
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import Foundation
import RequestKit

internal struct MBDirectionsConfiguration: Configuration {
internal struct MBDirectionsConfiguration {
internal var apiEndpoint: String = "https://api.mapbox.com"
internal var accessToken: String?

internal init(_ accessToken: String) {
self.accessToken = accessToken
}
}
}
139 changes: 61 additions & 78 deletions MapboxDirections/MBDirectionsRouter.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation
import CoreLocation
import RequestKit
import Alamofire

internal struct MBDirectionsWaypoint: CustomStringConvertible {
struct Heading: CustomStringConvertible {
Expand All @@ -23,7 +23,8 @@ internal struct MBDirectionsWaypoint: CustomStringConvertible {
}
}

internal enum MBDirectionsRouter: Router {
internal enum MBDirectionsRouter: URLRequestConvertible {

enum InstructionFormat: String {
case Text = "text"
case HTML = "html"
Expand All @@ -48,83 +49,65 @@ internal enum MBDirectionsRouter: Router {
case Full = "full"
}

case V4(Configuration, String, [MBDirectionsWaypoint], Bool?, InstructionFormat?, GeometryFormatV4?, Bool?)
case V5(Configuration, String, [MBDirectionsWaypoint], Bool?, GeometryFormatV5?, OverviewGranularity?, Bool?, Bool?)

var method: HTTPMethod {
return .GET
}

var encoding: HTTPEncoding {
return .URL
}

var configuration: Configuration {
switch self {
case .V4(let config, _, _, _, _, _, _): return config
case .V5(let config, _, _, _, _, _, _, _): return config
}
}
case V4(MBDirectionsConfiguration, String, [MBDirectionsWaypoint], Bool?, InstructionFormat?, GeometryFormatV4?, Bool?)
case V5(MBDirectionsConfiguration, String, [MBDirectionsWaypoint], Bool?, GeometryFormatV5?, OverviewGranularity?, Bool?, Bool?)

var params: [String: String] {
switch self {
case .V4(_, _, _, let includeAlternatives, let instructionFormat, let geometryFormat, let includeSteps):
var params: [String: String] = [
"alternatives": String(includeAlternatives ?? false),
]
if let instructionFormat = instructionFormat {
params["instructions"] = instructionFormat.rawValue
}
if let geometryFormat = geometryFormat {
params["geometry"] = geometryFormat.rawValue
}
if let includeSteps = includeSteps {
params["steps"] = String(includeSteps)
}
return params

case .V5(_, _, let waypoints, let includeAlternative, let geometryFormat, let overviewGranularity, let includeSteps, let allowPointUTurns):
var params: [String: String] = [:]
if let includeAlternative = includeAlternative {
params["alternative"] = String(includeAlternative)
}
let hasHeadings = !(waypoints.flatMap { $0.heading }.isEmpty)
if hasHeadings {
params["bearings"] = waypoints.map {
return $0.heading != nil ? "\($0.heading!)" : ""
}.joinWithSeparator(";")
var URLRequest: NSMutableURLRequest {
let result: (configuration: MBDirectionsConfiguration, path: String, parameters: [String: AnyObject]) = {
switch self {
case .V4(let configuration, let profileIdentifier, let waypoints, let includeAlternatives, let instructionFormat, let geometryFormat, let includeSteps):
var params: [String:AnyObject] = ["access_token": configuration.accessToken!]
let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";")
params["alternatives"] = String(includeAlternatives ?? false)
if let instructionFormat = instructionFormat {
params["instructions"] = instructionFormat.rawValue
}
if let geometryFormat = geometryFormat {
params["geometry"] = geometryFormat.rawValue
}
if let includeSteps = includeSteps {
params["steps"] = String(includeSteps)
}
return (configuration, "/v4/directions/\(profileIdentifier)/\(coordinates).json", params)

case .V5(let configuration, let profileIdentifier, let waypoints, let includeAlternative, let geometryFormat, let overviewGranularity, let includeSteps, let allowPointUTurns):
var params: [String:AnyObject] = ["access_token": configuration.accessToken!]
let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";")
if let includeAlternative = includeAlternative {
params["alternative"] = String(includeAlternative)
}
let hasHeadings = !(waypoints.flatMap { $0.heading }.isEmpty)
if hasHeadings {
params["bearings"] = waypoints.map {
return $0.heading != nil ? "\($0.heading!)" : ""
}.joinWithSeparator(";")
}
if let geometryFormat = geometryFormat {
params["geometries"] = geometryFormat.rawValue
}
if let overviewGranularity = overviewGranularity {
params["overview"] = overviewGranularity.rawValue
}
let hasAccuracies = !(waypoints.flatMap { $0.accuracy }.isEmpty)
if hasAccuracies {
params["radiuses"] = waypoints.map {
return $0.accuracy != nil ? "\($0.accuracy!)" : ""
}.joinWithSeparator(";")
}
if let includeSteps = includeSteps {
params["steps"] = String(includeSteps)
}
if let allowPointUTurns = allowPointUTurns {
params["uturns"] = String(allowPointUTurns)
}
return (configuration, "/directions/v5/\(profileIdentifier)/\(coordinates).json", params)
}
if let geometryFormat = geometryFormat {
params["geometries"] = geometryFormat.rawValue
}
if let overviewGranularity = overviewGranularity {
params["overview"] = overviewGranularity.rawValue
}
let hasAccuracies = !(waypoints.flatMap { $0.accuracy }.isEmpty)
if hasAccuracies {
params["radiuses"] = waypoints.map {
return $0.accuracy != nil ? "\($0.accuracy!)" : ""
}.joinWithSeparator(";")
}
if let includeSteps = includeSteps {
params["steps"] = String(includeSteps)
}
if let allowPointUTurns = allowPointUTurns {
params["uturns"] = String(allowPointUTurns)
}
return params
}
}

var path: String {
switch self {
case .V4(_, let profileIdentifier, let waypoints, _, _, _, _):
let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";")
return "v4/directions/\(profileIdentifier)/\(coordinates).json"

case .V5(_, let profileIdentifier, let waypoints, _, _, _, _, _):
let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";")
return "directions/v5/\(profileIdentifier)/\(coordinates).json"
}
}()

let URL = NSURL(string: result.configuration.apiEndpoint + result.path)!
let URLRequest = NSURLRequest(URL: URL)
let encoding = Alamofire.ParameterEncoding.URL

return encoding.encode(URLRequest, parameters: result.parameters).0
}
}
Loading

0 comments on commit 34b9799

Please sign in to comment.