/Fresher2016/BanLaKey - Merge/Keyboard/Giphy/Manager/BLGiphyRequestManager.swift

https://gitlab.com/qhcthanh/mygit · Swift · 193 lines · 119 code · 38 blank · 36 comment · 23 complexity · db2397ad826061b998d94f0eaba173a0 MD5 · raw file

  1. //
  2. // BLGiphyRequestManager.swift
  3. // EmojiKeyboard
  4. //
  5. // Created by qhcthanh on 8/18/16.
  6. // Copyright © 2016 Quach Ha Chan Thanh. All rights reserved.
  7. //
  8. import Foundation
  9. import UIKit
  10. var limitDefault: UInt = 30
  11. let kGiphyAPIKeyTrial = "dc6zaTOxFJmzC"
  12. let kHostGiphyLink = "http://api.giphy.com/v1/gifs"
  13. private typealias RequestCompletionHandler = (data: NSData?, respone: NSURLResponse?, error: NSError?) -> Void
  14. public typealias GiphyCompletionHandler = (giphy: [GiphyInfo]?, error: NSError?) -> Void
  15. private var giphyRequestToken: dispatch_once_t = 0
  16. public class BLGiphyRequestManager: NSObject {
  17. // The instance singleton BLGiphyRequestManager
  18. private static var instance: BLGiphyRequestManager!
  19. // The dataTask request a giphy in server. Just request one time 1 session task in giphy server
  20. private var dataTasks: [NSURLSessionTask]
  21. private override init() {
  22. self.dataTasks = [NSURLSessionTask]()
  23. super.init()
  24. }
  25. /**
  26. Get the singleton BLGiphyRequestManager
  27. - returns: The singleton GiphyManager
  28. */
  29. public class func shareManager() -> BLGiphyRequestManager {
  30. dispatch_once(&giphyRequestToken, {
  31. BLGiphyRequestManager.instance = BLGiphyRequestManager()
  32. })
  33. return BLGiphyRequestManager.instance
  34. }
  35. private func generateURLRequestGiphy(type: String, param: NSDictionary?) -> NSURL {
  36. var link: String
  37. if type != "" {
  38. link = "\(kHostGiphyLink)/\(type)?api_key=\(kGiphyAPIKeyTrial)"
  39. } else {
  40. link = "\(kHostGiphyLink)?api_key=\(kGiphyAPIKeyTrial)"
  41. }
  42. if let param = param {
  43. for key in param.allKeys {
  44. if let value = param.valueForKey(key as! String) {
  45. var valueKey = value
  46. if let value = value as? NSArray {
  47. valueKey = value.componentsJoinedByString(",")
  48. }
  49. link += "&\(key)=\(valueKey)"
  50. }
  51. }
  52. }
  53. return NSURL(string: link.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)!
  54. }
  55. public func searchKeywordGiphy(searchKeyword: String, limit: UInt = limitDefault, completion: GiphyCompletionHandler) {
  56. // Example
  57. // http://api.giphy.com/v1/gifs/search?q=funny+cat&api_key=dc6zaTOxFJmzC&limit=1
  58. let requestURL = self.generateURLRequestGiphy("search", param: ["q": searchKeyword.stringByReplacingOccurrencesOfString(" ", withString: "+").lowercaseString,"limit":limit])
  59. self.requestGiphy(requestURL) { (data, respone, error) in
  60. if let error = error {
  61. completion(giphy: nil,error: error)
  62. } else {
  63. // parse json
  64. completion(giphy: self.parseGiphyFromJsonData(data), error: error)
  65. }
  66. }
  67. }
  68. public func searchIDsGiphy(id: [String], limit: UInt = limitDefault, completion: GiphyCompletionHandler) {
  69. // Example
  70. // http://api.giphy.com/v1/gifs?api_key=dc6zaTOxFJmzC&ids=[feqkVgjJpYtjy,7rzbxdu0ZEXLy]
  71. let requestURL = self.generateURLRequestGiphy("", param: ["ids":id])
  72. self.requestGiphy(requestURL) { (data, respone, error) in
  73. if let error = error {
  74. completion(giphy: nil,error: error)
  75. } else {
  76. // parse json
  77. completion(giphy: self.parseGiphyFromJsonData(data), error: error)
  78. }
  79. }
  80. }
  81. public func getTrendGiphy(limit: UInt = limitDefault, completion: GiphyCompletionHandler) {
  82. // Example
  83. // http://api.giphy.com/v1/gifs/trending?api_key=dc6zaTOxFJmzC&limit=5
  84. let requestURL = self.generateURLRequestGiphy("trending", param: ["limit":limit])
  85. self.requestGiphy(requestURL) { (data, respone, error) in
  86. if let error = error {
  87. completion(giphy: nil,error: error)
  88. } else {
  89. // parse json
  90. completion(giphy: self.parseGiphyFromJsonData(data), error: error)
  91. }
  92. }
  93. }
  94. /**
  95. Get random giphy just once request once time
  96. */
  97. public func getRandomGiphy(tag: String? = nil, limit: UInt = limitDefault, completion: GiphyCompletionHandler) {
  98. // Example
  99. // http://api.giphy.com/v1/gifs/random?api_key=dc6zaTOxFJmzC
  100. // Tag: http://api.giphy.com/v1/gifs/random?api_key=dc6zaTOxFJmzC&tag=\(tag)
  101. let param = NSMutableDictionary()
  102. param["limit"] = limit
  103. if let tag = tag {
  104. param["tag"] = tag
  105. }
  106. let requestURL = self.generateURLRequestGiphy("random", param: param)
  107. self.requestGiphy(requestURL) { (data, respone, error) in
  108. if let error = error {
  109. completion(giphy: nil,error: error)
  110. } else {
  111. // parse json
  112. completion(giphy: self.parseGiphyFromJsonData(data, random: true), error: error)
  113. }
  114. }
  115. }
  116. private func requestGiphy(url: NSURL, completion: RequestCompletionHandler ) {
  117. YLSessionManager.sharedDefaultSessionManager().startDataTaskWithURL(url, completionHandler: {
  118. (data, respone, error) in
  119. completion(data: data, respone: respone, error: error)
  120. })
  121. // let newDataTask = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, respone, error) in
  122. // completion(data: data, respone: respone, error: error)
  123. // }
  124. // newDataTask.resume()
  125. //self.dataTasks.append(newDataTask)
  126. }
  127. private func parseGiphyFromJsonData(jsonData: NSData?, random: Bool = false) -> [GiphyInfo] {
  128. var giphyArray = [GiphyInfo]()
  129. if let jsonData = jsonData,
  130. let json = NSDictionary.fromJSON(jsonData)
  131. {
  132. if !random {
  133. if let giphyDatas = json.toArrayAtKey("data") {
  134. // Get array data giphy
  135. for giphyData in giphyDatas {
  136. if let jsonData = giphyData as? NSDictionary,
  137. let giphy = GiphyInfo.generateFormJSON(jsonData)
  138. {
  139. giphyArray.append(giphy)
  140. }
  141. }
  142. }
  143. } else {
  144. if let giphyDatas = json.toDictionaryAtKey("data"), let giphy = GiphyInfo.generateFromJSONOfRandomGiphy(giphyDatas) {
  145. giphyArray.append(giphy)
  146. }
  147. }
  148. }
  149. return giphyArray
  150. }
  151. public func cancelAllTask() {
  152. NSURLSession.sharedSession().invalidateAndCancel()
  153. }
  154. }