2017-12-23 25 views
0

最近Alamofireを使用する際に問題が発生しました。ここで Alamofireを使用してhttpリクエストを送信するスウィフト

は私のコード LoginViewController.swiftある

class LoginViewController: UIViewController { 

@IBOutlet weak var name: UITextField! 
@IBOutlet weak var email: UITextField! 
@IBOutlet weak var password: UITextField! 

let baseApi = BaseApi() 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 

@IBAction func loginButton(_ sender: UIButton) { 

    let dict = ["name":name.text,"email":email.text, 
     "password":password.text] 
    print("api succeed1") 
    let result = baseApi.login(paras: dict as! [String : String]) 
    print("api succeed2") 
    if result[0]["status"].string == "success" { 
     print("api succeed3") 
     present(UIStoryboard(name: "Main", bundle: 
     nil).instantiateViewController 
     (withIdentifier:"TabBarController") 
     as! TabBarController, animated: true, completion: nil) 
    } 
} 

BaseApi.swiftここ

class BaseApi{ 

func login(paras : [String:String]) -> JSON { 
    let url = URL(string: "http://127.0.0.1:8000/api/login") 
    let result = baseApi(url: url!,paras: paras) 
    print("BaseApi3333") 
    return result 
} 

func baseApi(url : URL,paras : [String:String]) -> JSON { 

    var json:JSON = [] 

    let toke = getToken() 

    let parameters: Parameters = [ 
     "name": paras["name"]!, 
     "email": paras["email"]!, 
     "password": paras["password"]! 
    ] 

    let headers: HTTPHeaders = [ 
     "Authorization": "Basic "+toke, 
     "Accept": "application/json" 
    ] 

    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in 
     switch response.result { 
     case .success(let value): 
      json = JSON(value) 
      print("baseAp2222") 
      print(json) 
     case .failure(let error): 
      print(error) 
     } 
    } 
    print("baseApi111") 
    print(json) 
    return json 
} 
} 

は、印刷(baseApi111)が出てくる理由は私の質問があり、ログ

api succeed1 
baseApi111 
[ 

] 
BaseApi3333 
api succeed2 
baseAp2222 
{ 
    "status_code" : 200, 
    "status" : "success", 
    "data" : { 
    "token" : "xxxx" 
    } 
} 

ですprint( "baseAp2222")の前に、私はjsonを返す必要がありますが、excute命令のようです私はこの問題をどのように解決すべきですか?

答えて

1

リターンコールを行うにはコールバッククロージャを使用する必要があります.APIコールからこのようなデータを返すことはできません。

func fetchDataFromWebService<T: Mappable>(_ parameters: Dictionary<String , AnyObject>, closure:@escaping (_ response: T) -> Void){ 
    let url = getWebServiceUrl() 

    //  let url = NSURL(string: getWebServiceUrl) 
    print("parameters = \(parameters)") 

    Alamofire.request(url, method: .get, parameters: parameters, headers: nil).responseJSON { (response:DataResponse<Any>) in 
     switch(response.result) { 
     case .success(_): 
      if response.response?.statusCode == 200 || response.response?.statusCode == 201 { 
       // print(response.result.value) 
       var user = Mapper<T>().map(JSONObject: response.result.value) 
       //     var user = Mapper<T>().map(response.result.value) 
       if self.processSingleRecord() == true { 

        user = Mapper<T>().map(JSONObject: (response.result.value as! NSArray).object(at: 0)) 
        //      user = Mapper<T>().map(response.result.value?.objectAtIndex(0)) 
       } 
       closure(user!) 
       //      print("user = ",user) 
      } 
      else if response.response?.statusCode == 0{ 
       // print(self.DisplayNetworkAvailabilityMessage()) 
      } 
      else { 
       if let _ = response.result.value as? Error { 
       } 
      } 
      break 

     case .failure(let error): 
      debugPrint("getEvents error: \(error)") 
      SVProgressHUD.dismiss() 
      break 

     } 
    } 

} 
今ここで

このメソッドの呼び出しです - - あなたはsequential code executionを理解する必要が

let anotherWebServiceHandler = DeviceTokenDataHandler.init()  anotherWebServiceHandler.fetchDataFromWebService(["":""], closure: { (response:SignUpResponse) -> Void in 

    }) 

- almofireを使用して、APIの呼び出しを行っている方法は、次の -

例を挙げましょうし、 Closures

+0

あなたの意見は正しいです、私はここで新しいコーダーですので、簡単な例を教えてください。 – AlenLee

+0

私はちょうど答えを編集した、あなたはあなたのAPIが何かを返すときに実行されるあなたのメソッドにコールバックを添付する必要があります.. –

+0

おかげで、私はあなたの答えは正しいと信じていますが、私はそれを理解しようとしています..私が知る必要がある多くのもののように見えます.. – AlenLee

関連する問題