Skip to content

Instantly share code, notes, and snippets.

@doapp-grady
Last active June 29, 2016 21:44
Show Gist options
  • Save doapp-grady/bb0882872279c9a8e1e8787147e43b50 to your computer and use it in GitHub Desktop.
Save doapp-grady/bb0882872279c9a8e1e8787147e43b50 to your computer and use it in GitHub Desktop.
import Foundation
enum NMAdError: ErrorType , CustomStringConvertible {
case NotConfigured(missing: String)
case InvalidData(message: String)
case NetworkingError(error: NSError)
var description: String {
switch self {
case .InvalidData(let message):
return "Invalid Data: \(message)"
case .NotConfigured(let missing):
return "Not Configured: Missing \(missing)"
case .NetworkingError(let error):
return "Networking Error: \(error.userInfo[NSLocalizedDescriptionKey])"
}
}
}
enum Result<SuccessObject, ErrorObject> {
case Success(SuccessObject)
case Failure(ErrorObject)
}
typealias NMAdSettingsRequestCompletion = (result: Result<NMAdSettings, NMAdError>) -> Void
class NMAdManager {
static let sharedManager = NMAdManager()
var settingsUrl: NSURL?
func requestAdSettings(completion: NMAdSettingsRequestCompletion) {
guard let settingsUrl = settingsUrl else {
completion(result: Result.Failure(NMAdError.NotConfigured(missing: "Settings URL")))
return
}
requestAdSettings(adSettingsUrl: settingsUrl, completion: completion)
}
}
private extension NMAdManager {
func requestAdSettings(adSettingsUrl adSettingsUrl: NSURL, completion: NMAdSettingsRequestCompletion) {
let task = NSURLSession.sharedSession().dataTaskWithURL(adSettingsUrl) {
(data, response, error) in
if let error = error {
completion(result: Result.Failure(NMAdError.NetworkingError(error: error)))
return
}
guard let data = data else {
completion(result: Result.Failure(NMAdError.InvalidData(message: "No data returned")))
return
}
guard let adSettings = NMAdSettings.createWithData(data) else {
completion(result: Result.Failure(NMAdError.InvalidData(message: "Could not convert data into expected class")))
return
}
completion(result: Result.Success(adSettings))
}
task.resume()
}
}
class ExampleAdRequester {
var done: Bool?
func requestSettings() {
let adManager = NMAdManager()
adManager.settingsUrl = NSURL(string: "https://s3.amazonaws.com/statictest.mobilelocalnews.com/settings/adsettings.json")!
adManager.requestAdSettings { result in
switch result {
case let .Success(adSettings):
print("Success: \(adSettings.globalAdSettings.appOpen?.enabled)")
case let .Failure(error):
switch error {
case NMAdError.NotConfigured:
print("\(error)")
fatalError()
case NMAdError.InvalidData(let message):
print("Invalid Data: \(message)")
case let e as NSError:
print("NSError: \(e)")
default:
print("Unknown Failure: \(error)")
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment