Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 99 additions & 90 deletions API/WAPIManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public enum Language : String {
public enum WeatherResult {
case Success(JSON)
case Error(String)

public var isSuccess: Bool {
switch self {
case .Success:
Expand All @@ -55,47 +55,47 @@ public enum WeatherResult {


public class WAPIManager {
private var params = [String : AnyObject]()

private var params = [String : String]()
public var temperatureFormat: TemperatureFormat = .Kelvin {
didSet {
params["units"] = temperatureFormat.rawValue
}
}

public var language: Language = .English {
didSet {
params["lang"] = language.rawValue
}
}

public init(apiKey: String) {
params["APPID"] = apiKey
}

public convenience init(apiKey: String, temperatureFormat: TemperatureFormat) {
self.init(apiKey: apiKey)
self.temperatureFormat = temperatureFormat
self.params["units"] = temperatureFormat.rawValue

}

public convenience init(apiKey: String, temperatureFormat: TemperatureFormat, lang: Language) {
self.init(apiKey: apiKey, temperatureFormat: temperatureFormat)

self.language = lang
self.temperatureFormat = temperatureFormat

params["units"] = temperatureFormat.rawValue
params["lang"] = lang.rawValue
}
}

// MARK: Private functions
extension WAPIManager {
private func apiCall(method: Router, response: (WeatherResult) -> Void) {
Alamofire.request(method).responseJSON { (_, _, data) in
guard let js: AnyObject = data.value where data.isSuccess else {
private func apiCall(method: Router, response: @escaping (WeatherResult) -> Void) {
Alamofire.request(method).responseJSON { (data) in
guard let js: AnyObject = data.value as AnyObject? else {
response(WeatherResult.Error(data.error.debugDescription))
return
}
Expand All @@ -105,18 +105,22 @@ extension WAPIManager {
}

enum Router: URLRequestConvertible {
func asURLRequest() throws -> URLRequest {
fatalError()
}

static let baseURLString = "http://api.openweathermap.org/data/"
static let apiVersion = "2.5"

case Weather([String: AnyObject])
case ForeCast([String: AnyObject])
case DailyForecast([String: AnyObject])
case HirstoricData([String: AnyObject])
var method: Alamofire.Method {
return .GET

var method: HTTPMethod {
return HTTPMethod.get
}

var path: String {
switch self {
case .Weather:
Expand All @@ -129,133 +133,138 @@ enum Router: URLRequestConvertible {
return "/history/city"
}
}

// MARK: URLRequestConvertible
var URLRequest: NSMutableURLRequest {
let URL = NSURL(string: Router.baseURLString + Router.apiVersion)!
let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableURLRequest.HTTPMethod = method.rawValue

func encode(params: [String: AnyObject]) -> NSMutableURLRequest {
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: params).0
var URLRequest: DataRequest? {
guard let URL = NSURL(string: Router.baseURLString + Router.apiVersion) else { return nil }
guard let pathURL = URL.appendingPathComponent(path) else { return nil }

func encode(params: [String: AnyObject]) -> DataRequest {
return Alamofire.request(pathURL.absoluteString,
method: method,
parameters: params)
.responseJSON { (response: DataResponse<Any>) in
guard let json = response.result.value as? [String:Any] else { return }
print("\(json)")
}
}

switch self {
case .Weather(let parameters):
return encode(parameters)
return encode(params: parameters)
case .ForeCast(let parameters):
return encode(parameters)
return encode(params: parameters)
case .DailyForecast(let parameters):
return encode(parameters)
return encode(params: parameters)
case .HirstoricData(let parameters):
return encode(parameters)
return encode(params: parameters)
}
}
}


//MARK: - Get Current Weather
extension WAPIManager {
private func currentWeather(params: [String:AnyObject], data: (WeatherResult) -> Void) {
apiCall(Router.Weather(params)) { data($0) }

private func currentWeather(params: [String:AnyObject], data: @escaping (WeatherResult) -> Void) {
apiCall(method: Router.Weather(params)) { data($0) }
}
public func currentWeatherByCityNameAsJson(cityName: String, data: (WeatherResult) -> Void) {

public func currentWeatherByCityNameAsJson(cityName: String, data: @escaping (WeatherResult) -> Void) {
params["q"] = cityName
currentWeather(params) { data($0) }

currentWeather(params: params as [String : AnyObject]) { data($0) }
}
public func currentWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: (WeatherResult) -> Void) {

public func currentWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: @escaping (WeatherResult) -> Void) {

params["lat"] = String(stringInterpolationSegment: coordinates.latitude)
params["lon"] = String(stringInterpolationSegment: coordinates.longitude)
currentWeather(params) { data($0) }

currentWeather(params: params as [String : AnyObject]) { data($0) }
}

}

//MARK: - Get Forecast
extension WAPIManager {
private func forecastWeather(parameters: [String:AnyObject], data: (WeatherResult) -> Void) {
apiCall(Router.ForeCast(params)) { data($0) }

private func forecastWeather(parameters: [String:AnyObject], data: @escaping (WeatherResult) -> Void) {
apiCall(method: Router.ForeCast(params as [String : AnyObject])) { data($0) }
}
public func forecastWeatherByCityNameAsJson(cityName: String, data: (WeatherResult) -> Void) {

public func forecastWeatherByCityNameAsJson(cityName: String, data: @escaping (WeatherResult) -> Void) {
params["q"] = cityName
forecastWeather(params) { data($0) }

forecastWeather(parameters: params as [String : AnyObject]) { data($0) }
}
public func forecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: (WeatherResult) -> Void) {

public func forecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: @escaping (WeatherResult) -> Void) {

params["lat"] = String(stringInterpolationSegment: coordinates.latitude)
params["lon"] = String(stringInterpolationSegment: coordinates.longitude)
forecastWeather(params) { data($0) }

forecastWeather(parameters: params as [String : AnyObject]) { data($0) }
}

}

//MARK: - Get Daily Forecast
extension WAPIManager {
private func dailyForecastWeather(parameters: [String:AnyObject], data: (WeatherResult) -> Void) {
apiCall(Router.DailyForecast(params)) { data($0) }

private func dailyForecastWeather(parameters: [String:AnyObject], data: @escaping (WeatherResult) -> Void) {
apiCall(method: Router.DailyForecast(params as [String : AnyObject])) { data($0) }
}
public func dailyForecastWeatherByCityNameAsJson(cityName: String, data: (WeatherResult) -> Void) {

public func dailyForecastWeatherByCityNameAsJson(cityName: String, data: @escaping (WeatherResult) -> Void) {
params["q"] = cityName
dailyForecastWeather(params) { data($0) }

dailyForecastWeather(parameters: params as [String : AnyObject]) { data($0) }
}
public func dailyForecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: (WeatherResult) -> Void) {

public func dailyForecastWeatherByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, data: @escaping (WeatherResult) -> Void) {

params["lat"] = String(stringInterpolationSegment: coordinates.latitude)
params["lon"] = String(stringInterpolationSegment: coordinates.longitude)
dailyForecastWeather(params) { data($0) }

dailyForecastWeather(parameters: params as [String : AnyObject]) { data($0) }
}

}


//MARK: - Get Historic Data
extension WAPIManager {
private func historicData(parameters: [String:AnyObject], data: (WeatherResult) -> Void) {

private func historicData(parameters: [String:AnyObject], data: @escaping (WeatherResult) -> Void) {
params["type"] = "hour"
apiCall(Router.HirstoricData(params)) { data($0) }

apiCall(method: Router.HirstoricData(params as [String : AnyObject])) { data($0) }
}
public func historicDataByCityNameAsJson(cityName: String, start: NSDate, end: NSDate?, data: (WeatherResult) -> Void) {

public func historicDataByCityNameAsJson(cityName: String, start: NSDate, end: NSDate?, data: @escaping (WeatherResult) -> Void) {
params["q"] = cityName
params["start"] = start.timeIntervalSince1970

params["start"] = "\(start.timeIntervalSince1970)"
if let endDate = end {
params["end"] = endDate.timeIntervalSince1970
params["end"] = "\(endDate.timeIntervalSince1970)"
}
historicData(params) { data($0) }

historicData(parameters: params as [String : AnyObject]) { data($0) }
}
public func historicDataByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, start: NSDate, end: NSDate?, data: (WeatherResult) -> Void) {

public func historicDataByCoordinatesAsJson(coordinates: CLLocationCoordinate2D, start: NSDate, end: NSDate?, data: @escaping (WeatherResult) -> Void) {

params["lat"] = String(stringInterpolationSegment: coordinates.latitude)
params["lon"] = String(stringInterpolationSegment: coordinates.longitude)
params["start"] = start.timeIntervalSince1970

params["start"] = "\(start.timeIntervalSince1970)"
if let endDate = end {
params["end"] = endDate.timeIntervalSince1970
params["end"] = "\(endDate.timeIntervalSince1970)"
}
historicData(params) { data($0) }

historicData(parameters: params as [String : AnyObject]) { data($0) }
}

}