Swift Alamofire SwiftyJSON异步/同步类方法

前端之家收集整理的这篇文章主要介绍了Swift Alamofire SwiftyJSON异步/同步类方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我目前有以下内容
  1. class ViewController: UIViewController {
  2.  
  3. class Identity{
  4. let baseUrl = "superSecretURL"
  5. var _username: String = ""
  6. var _password: String = ""
  7. var _apiKey: String = ""
  8.  
  9. init(){
  10.  
  11. }
  12.  
  13. init(username: String,apiKey: String){
  14. _username = username
  15. _apiKey = apiKey
  16. }
  17.  
  18. init(username: String,password: String){
  19. _username = username
  20. _password = password
  21. }
  22.  
  23. func loginPassword() -> String{
  24. var loginJSON = ["auth": ["passwordCredentials": ["username": _username,"password": _password]]];
  25. var returnJSON: String
  26.  
  27. request(.POST,baseUrl,parameters: loginJSON,encoding: .JSON)
  28. .responseJSON { (request,response,data,error) in
  29. if let anError = error
  30. {
  31. // got an error in getting the data,need to handle it
  32. println("error calling POST on /posts")
  33. println(error)
  34. }
  35. else if let data: AnyObject = data
  36. {
  37. // handle the results as JSON,without a bunch of nested if loops
  38. let post = JSON(data)
  39. // to make sure it posted,print the results
  40. println("JSON Returned")
  41. }
  42. }
  43. }
  44. }
  45.  
  46. var i = Identity(username: "secretName",password: "complicatedPassword")
  47.  
  48. override func viewDidLoad() {
  49. super.viewDidLoad()
  50. // Do any additional setup after loading the view,typically from a nib.
  51.  
  52. println("Before Call")
  53.  
  54.  
  55.  
  56. println("After Call")
  57.  
  58. }
  59.  
  60. override func didReceiveMemoryWarning() {
  61. super.didReceiveMemoryWarning()
  62. // Dispose of any resources that can be recreated.
  63. }
  64.  
  65.  
  66. }

基本上我希望能够调用println(“Before Call”)然后从loginPassword()方法接收响应,然后println(“After Call”).这是我相信同步,但我无法找到一种方法让它工作,整个线程的事情让我感到困惑.

我基本上希望能够说:

  1. if i.loginPassword(){ // do some login stuff }else{ // do some error stuff }

任何帮助或指针赞赏.

您需要在loginPassword()函数中设置要调用的回调函数.

这可能是实现它的一种方式:

  1. func loginPassword(callback: ((isOk: Bool)->Void)?) -> String{
  2. var loginJSON = ["auth": ["passwordCredentials": ["username": _username,"password": _password]]];
  3. var returnJSON: String
  4.  
  5. request(.POST,encoding: .JSON)
  6. .responseJSON { (request,error) in
  7. if let anError = error{
  8. // got an error in getting the data,need to handle it
  9. println("error calling POST on /posts")
  10. println(error)
  11.  
  12. callback?(isOk: false)
  13. }
  14. else if let data: AnyObject = data{
  15. // handle the results as JSON,without a bunch of nested if loops
  16. let post = JSON(data)
  17. // to make sure it posted,print the results
  18. println("JSON Returned")
  19.  
  20. callback?(isOk: true)
  21. }
  22. }
  23. }

然后…

  1. override func viewDidLoad() {
  2. super.viewDidLoad()
  3.  
  4. var identity = Identity(username: "John Apleseed",apiKey: "213123123")
  5.  
  6. identity.loginPassword { (isOK) -> Void in
  7. if (isOK) {
  8. //do good stuff here
  9. }else{
  10. // do error handling here
  11. }
  12.  
  13. }
  14. }

UPDATE

此外,您的调用函数可能如下所示:

  1. override func viewDidLoad() {
  2. super.viewDidLoad()
  3.  
  4. var identity = Identity(username: "John Apleseed",apiKey: "213123123")
  5. identity.loginPassword(handlePasswordRequest)
  6. }

并且您可以添加尽可能多的回调处理程序,而无需乱搞一堆嵌套的闭包……

  1. private func handlePasswordRequest(isOK: Bool){
  2. if (isOK) {
  3. //do good stuff here
  4. }else{
  5. // do error handling here
  6. }
  7. }

更新2

如果您需要在调用层次结构中深入调用回调,则需要将回调作为每个先前闭包的参数传递.

更新3

我会尝试一下RxAlamofire和RxSwift

猜你在找的Swift相关文章