2017-10-04 3 views
0

Un nouveau type Swift ici. J'essaie de comprendre comment enchaîner plusieurs appels Alamofire.Alamofire request chaining - Impossible d'appeler la valeur du type non-fonction 'HTTPURLResponse'

J'ai besoin de

  1. obtenir un jeton d'authentification du serveur 1
  2. obtenir des données du serveur 1 (besoin du jeton de auth)
  3. obtenir un jeton d'authentification du serveur 2
  4. Plus données du serveur 2 sur la base des valeurs de l'étape 2.

J'ai essayé suivant les exemples de cet article: Chain multiple Alamofire requests

Malheureusement, aucun de ces exemples travaillent avec Swift 4.

J'ai décidé de poursuivre l'option 2, mais continuer à obtenir un

Impossible valeur appeler de type non-fonction 'HTTPURLResponse?'

erreur à la fois sur les lignes putRequest et getRequest. Je n'ai aucune idée de ce que cela signifie ou comment le réparer.

Mon code actuel:

import UIKit 
import PromiseKit 
import Alamofire 
import SwiftyJSON 


class ViewController: UIViewController { 


let URL = "http://httpbin.org/" 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func runPutRequest() { 
    let putRequest = Alamofire.request("\(URL)/get") 
    putRequest.response { [weak self] putRequest, putResponse, putData, putError in 
     if let strongSelf = self { 
      // Probably store some data 
      strongSelf.runGetRequest() 
     } 
    } 
} 

func runGetRequest() { 
    let getRequest = Alamofire.request("\(URL)/get", method: .get) 
    getRequest.response { [weak self] getRequest, getResponse, getData, getError in 
     if let strongSelf = self { 
      // Probably store more data 
      strongSelf.processResponse() 
     } 
    } 
} 

func processResponse() { 
    // Process that data 
} 

func reloadData() { 
    // Reload that data 
} 
} 

Toute aide serait grandement appréciée.

Répondre

1

Vous avez trop d'arguments de retour pour les fermetures response, vous avez juste besoin d'un argument DataResponse. Ce code fonctionne pour moi:

func runPutRequest() { 
    let putRequest = Alamofire.request("\(URL)/get", method: .put) 
    putRequest.response { [weak self] response in 
     if let strongSelf = self { 
      // Probably store some data 
      strongSelf.runGetRequest() 
     } 
    } 
} 

func runGetRequest() { 
    let getRequest = Alamofire.request("\(URL)/get", method: .get) 
    getRequest.response { [weak self] response in 
     if let strongSelf = self { 
      // Probably store more data 
      strongSelf.processResponse() 
     } 
    } 
}