Advertisement
Guest User

Untitled

a guest
May 24th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.46 KB | None | 0 0
  1. // NetworkService.swift
  2.  
  3. import Alamofire
  4. import AlamofireObjectMapper
  5. import ObjectMapper
  6.  
  7. /*!
  8. * A service that abstracts the underlying network calls and stores data
  9. * to the data store, or returns them in the completion handler.
  10. */
  11. struct NetworkService {
  12.  
  13. static var endpoints: Dictionary<String, String>?
  14.  
  15. init(apiRootUrl: String) {
  16. Alamofire.request(.GET, apiRootUrl, parameters: nil, encoding: .URL, headers: nil).responseJSON { (response: Response<AnyObject, NSError>) in
  17. if let data = response.data {
  18. do {
  19. let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)
  20. NetworkService.endpoints = json as? Dictionary<String, String>
  21. } catch {
  22. //Failed to fetch API endpoints.
  23. fatalError("Failed to fetch intial endpoints.")
  24. }
  25. }
  26. }
  27. }
  28.  
  29. // MARK: Private Methods
  30.  
  31. /*!
  32. * Fetch a results list from the given API endpoint.
  33. */
  34. private static func getResults<T: RemoteResultProtocol>(url: String, params: Dictionary<String, String>?, headers: Dictionary<String, String>?,
  35. completionHandler: (results: [T]) -> ()) {
  36. let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
  37. let request = Alamofire.request(.GET, url, parameters: params, encoding: .URL, headers: headers)
  38.  
  39. request.responseArray(queue: queue, keyPath: "results") { (results: Response<[T], NSError>) in
  40. if let value = results.result.value {
  41. completionHandler(results: value)
  42. }
  43. }
  44. }
  45.  
  46. /*!
  47. * Fetch a single item from the given API endpoint.
  48. */
  49. private static func getObject<T: RemoteResultProtocol>(url: String, params: Dictionary<String, String>?, headers: Dictionary<String, String>?,
  50. completionHandler: (result: T) -> ()) {
  51. let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
  52. let request = Alamofire.request(.GET, url, parameters: params, encoding: .URL, headers: headers)
  53.  
  54. request.responseObject(queue: queue, keyPath: "") { (result: Response<T, NSError>) in
  55. if let value = result.result.value {
  56. completionHandler(result: value)
  57. }
  58. }
  59. }
  60.  
  61.  
  62. /*!
  63. * Update a given item at the given API endpoint.
  64. */
  65. private static func putObject<T: RemoteResultProtocol>(object: T, url: String, params: Dictionary<String, String>?,
  66. headers: Dictionary<String, String>?, completionHandler: (response: Response<AnyObject, NSError>) -> ()) {
  67. let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
  68. let request = Alamofire.request(.PUT, url, parameters: params, encoding: .URLEncodedInURL, headers: headers)
  69. request.responseJSON(queue: queue, completionHandler: completionHandler)
  70. }
  71.  
  72.  
  73. /*!
  74. * Delete a given item from the given API endpoint.
  75. */
  76. private static func deleteObject<T: RemoteResultProtocol>(object: T, url: String, params: Dictionary<String, String>?,
  77. headers: Dictionary<String, String>?, completionHandler: (Response<AnyObject, NSError>) -> ()) {
  78. let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
  79. let request = Alamofire.request(.DELETE, url, parameters: params, encoding: .URLEncodedInURL, headers: headers)
  80. request.responseJSON(queue: queue, completionHandler: completionHandler)
  81. }
  82. }
  83.  
  84. protocol RemoteResultProtocol: Mappable {
  85. static var serializedIdentifier: String { get set }
  86. var url: String { get set }
  87. }
  88.  
  89. extension RemoteResultProtocol {
  90.  
  91. /*!
  92. * Fetch a single object from the remote API.
  93. */
  94. static func getSingle<T: RemoteResultProtocol>(completionHandler: (_: T) -> ()) {
  95. let endpoint = NetworkService.endpoints![serializedIdentifier]
  96. NetworkService.getObject(endpoint!, params: nil, headers: nil, completionHandler: completionHandler)
  97. }
  98.  
  99. /*!
  100. * Fetch a result set from the remote API.
  101. */
  102. static func getResultSet<T: RemoteResultProtocol>(completionHandler: (_: [T]) -> ()) {
  103. let endpoint = NetworkService.endpoints![serializedIdentifier]
  104. NetworkService.getResults(endpoint!, params: nil, headers: nil, completionHandler: completionHandler)
  105. }
  106.  
  107. /*!
  108. * Search for a result set from the remote API.
  109. */
  110. static func search<T: RemoteResultProtocol>(params: Dictionary<String, String>?, completionHandler: (_: [T]) -> ()) {
  111. let endpoint = NetworkService.endpoints![serializedIdentifier]
  112. NetworkService.getResults(endpoint!, params: params, headers: nil, completionHandler: completionHandler)
  113. }
  114.  
  115. /*!
  116. * Given a model, persist it to the remote API.
  117. */
  118. func save(headers: Dictionary<String, String>?, completionHandler: (response: Response<AnyObject, NSError>) -> ()) {
  119. NetworkService.putObject(self, url: self.url, params: nil, headers: nil, completionHandler: completionHandler)
  120. }
  121.  
  122. /*!
  123. * Deletes a given model from the remote API.
  124. */
  125. func delete(headers: Dictionary<String, String>?, completionHandler: (response: Response<AnyObject, NSError>) -> ()) {
  126. NetworkService.deleteObject(self, url: self.url, params: nil, headers: headers, completionHandler: completionHandler)
  127. }
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement