Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. final class RestService {
  2.  
  3. ///Singleton instance
  4. private static let instance: RestService = RestService()
  5.  
  6. ///Singleton instance getter
  7. static var Instance: RestService {
  8. get { return instance }
  9. }
  10.  
  11. /// *DispatchQueue* with midium priority.
  12. final let queue = DispatchQueue(label: "com.cnoon.response-queue", qos: .userInitiated, attributes: .concurrent)
  13.  
  14. func createRequest(method: HTTPMethod, url: String, parameters: [String : AnyObject], completion: @escaping (Data, NetworkCode) -> Void) {
  15. // Do alamofire async request.
  16. Alamofire.request(url, method: method, parameters: parameters).responseData(queue: queue) { (data) in
  17. // Handle response.
  18.  
  19. self.responseHandler(dataResponse: data, completion: { (data, networkCode) in
  20. completion(data, networkCode)
  21. })
  22. }
  23. }
  24.  
  25. func responseHandler(dataResponse: DataResponse<Data>, completion: @escaping (Data, NetworkCode) -> Void) {
  26.  
  27. guard (dataResponse.response?.statusCode) != nil else { completion(Data(), .error); return }
  28. guard Connectivity.Instance.isReachability else { completion(Data(), .noInternetConnection); return }
  29. // Response must be different than 401 - 401 code means we fucked up request.
  30.  
  31. print(dataResponse.request)
  32.  
  33. if dataResponse.response?.statusCode == 401 {
  34. // TODO: Handle message from server.
  35. completion(Data(), .error)
  36. return
  37. }
  38. // Return data from resonse if everything went ok ( status code 200 )
  39. guard let data = dataResponse.data else { completion(Data(), .error); return }
  40. completion(data, .success)
  41. }
  42. }
  43.  
  44. enum NetworkCode: Int {
  45. case noInternetConnection = 0, error = 1, wrongToken = 2, unknownCode = 3, success = 4
  46. }
  47.  
  48. protocol Requestable {
  49. /// Specifices needed request.
  50. ///
  51. /// - Parameter requestType: Which request.
  52. func request(requestType: RequestType<Any>)
  53. }
  54.  
  55.  
  56. enum RequestType<T> {
  57. case login(T), firstGroupRequest(T), secondGroupRequest(T)
  58. }
  59.  
  60. /// Handling requests.
  61. ///
  62. /// - Parameter requestType: For which request.
  63. func request(requestType: RequestType<Any>) {
  64. switch requestType {
  65. case .login(let user):
  66. let loginQueryParams = buildQueryParams(requestType: .login(user))
  67. loginRequestWith(loginQueryParams, completion: { token in
  68. guard let token = token else { return }
  69.  
  70. self.dispatchGroup(token: token, user: user as! User)
  71.  
  72. })
  73. default:
  74. break
  75. }
  76. }
  77.  
  78. private func dispatchGroup(token: String, user: User) {
  79. // Create dispatch group.
  80. let group = DispatchGroup()
  81.  
  82. group.enter()
  83. let firstQueryParams = self.buildQueryParams(requestType: . firstGroupRequest(token))
  84. self.firstRequestWith(firstQueryParams, completion: {
  85. print("1 request")
  86. group.leave()
  87. })
  88.  
  89. group.enter()
  90. let secondQueryParams = self.buildQueryParams(requestType: . secondGroupRequest(token))
  91. self.secondRequestWith(secondQueryParams, completion: {
  92. print("2 request")
  93. group.leave()
  94. })
  95.  
  96. group.wait()
  97.  
  98. group.notify(queue: .main, work: DispatchWorkItem(block: {
  99. print("Main")
  100.  
  101. }))
  102. }
  103.  
  104. private func firstRequestWith(_ params: [String: AnyObject], completion: @escaping () -> Void) {
  105. RestService.Instance.createRequest(method: .get, url: GET_FIRST, parameters: params, completion: { (data, networkCode) in
  106. switch networkCode {
  107. case .success:
  108. // YEAH we did it ! Got the correct data!
  109. completion()
  110. case .error:
  111. completion()
  112. case .noInternetConnection:
  113. completion()
  114. case .unknownCode:
  115. completion()
  116. case .wrongToken:
  117. completion()
  118. }
  119. })
  120. }
  121.  
  122. private func secondRequestWith(_ params: [String: AnyObject], completion: @escaping () -> Void) {
  123. RestService.Instance.createRequest(method: .get, url: GET_SECOND, parameters: params, completion: { (data, networkCode) in
  124. switch networkCode {
  125. case .success:
  126. // YEAH we did it ! Got the correct data!
  127. completion()
  128. case .error:
  129. completion()
  130. case .noInternetConnection:
  131. completion()
  132. case .unknownCode:
  133. completion()
  134. case .wrongToken:
  135. completion()
  136. }
  137. })
  138. }
  139.  
  140. func buildQueryParams(requestType: RequestType<Any>) -> [String : AnyObject] {
  141. var params: [String : String]!
  142.  
  143. switch requestType {
  144. case .login(let user as User):
  145. params = [
  146. "username" : user.username,
  147. "password" : user.password,
  148. ]
  149. return params as [String: AnyObject]
  150. case .getFirstGroupRequest(let token as String), .getSecondGroupRequest(let token as String):
  151. params = [
  152. "token" : token,
  153. ]
  154. return params as [String: AnyObject]
  155. default:
  156. return [:]
  157. }
  158. }
  159.  
  160. public final class User: Object {
  161. @objc dynamic var id = 0
  162. @objc dynamic var username = ""
  163. @objc dynamic var password = ""
  164.  
  165. override public static func primaryKey() -> String? {
  166. return "id"
  167. }
  168.  
  169. convenience init(id: Int, username: String, password: String) {
  170. self.init() // I need to call this to create an Object -> It's messy way I believie becouse realm has an initializer which is going to be called -> 2x work
  171. self.id.= id
  172. self.username = username
  173. self.password = password
  174. }
  175. }
  176.  
  177. @IBAction func loginAction(_ sender: UIButton) {
  178.  
  179. guard let username = usernameTextField.text, let password = passwordTextField.text else { return }
  180.  
  181. request(requestType: .login(User(id: 0, username: username, password: password))
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement