Last active
June 29, 2016 21:44
-
-
Save doapp-grady/bb0882872279c9a8e1e8787147e43b50 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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