2017-07-11 11 views
1

Udacity APIからセッションIDを取得したことを確認した後、新しいSegueに移行しようとしています。しかし、私はこの後に実行するコードを取得することはできません。セッションIDとすべての情報は印刷されますが、その後は何も完了しません。私がこの機能で間違っていることはありますか?私はUIUpdatesを実行してみたところ、 "Hello"を印刷しようとしましたが、どちらもうまくいきませんでした。以下はコードと私のGitHubプロファイルです。 https://github.com/SteveBurgos95/UdacityMapProjectネットワークリクエストを取得した後にIBActionでコードを実行できない

@IBAction func loginButton(_ sender: Any) { 
UdacityClient.sharedInstance().loginWithUsername(emailTextField.text!, password: passwordTextField.text!){ (success, error) in 
    performUIUpdatesOnMain { 
     if success { 
      print("Hello") 
     } else { 
      print("Hey") 
     } 
    } 
} 

private func completeLogin() { 
emailTextField.text = "" 
let controller = storyboard!.instantiateViewController(withIdentifier: "TableMapViewController") as! UINavigationController 
present(controller, animated: true, completion: nil) 
+0

でコールバックを受け取ることはありませんperformUIUpdatesOnMain閉鎖前に印刷するときに、あなたが何を参照していますか? – Thomas

+0

@peterはい私はこれに類似したものをプリントアウトします。 APIの期待される動作は次のとおりです。 { "アカウント":{ が "登録":真、 "キー": "3903878747" }、 "セッション":{ "ID": "1457628510Sc18f2ad4cd3fb317fb8e028488694088"、 "満了":」 2015-05-10T16:48:30.760460Z「 」 } –

答えて

2

dataTaskが(エラーと成功の場合は両方)を終了したとき、あなたがUdacityClient.swiftであなたのcompletionhandlerを呼び出すことはありませんているように私には思えますか?

let task = session.dataTask(with: request as URLRequest) { data, response, error in 

    // Make sure there is no error, or else 
    guard error == nil else { // Handle error… 

     completionHandler(false, error?.localizedDescription) 
     /* 
     func sendError(_ error: String) { 
     print(error) 
     let userInfo = [NSLocalizedDescriptionKey : error] 
     completionHandlerForGET(nil, NSError(domain: "taskForGETMethod", code: 1, userInfo: userInfo)) 
     */ 
     return 
    } 

    completionHandler(true, nil) 
} 
-1

変更あなたがsucessブロック内に実装していないので、UIが更新取得されていないコードを見た後、以下の

 func loginWithUsername(_ username: String, password: String, completionHandler: @escaping (_ success: Bool, _ errorMessage: String?) -> Void) { 
     let request = NSMutableURLRequest(url: URL(string: "https://www.udacity.com/api/session")!) 
     request.httpMethod = "POST" 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 
     request.addValue("application/json", forHTTPHeaderField: "Content-Type") 

     request.httpBody = "{\"udacity\": {\"username\": \"\(username)\", \"password\": \"\(password)\"}}".data(using: String.Encoding.utf8) 

     let session = URLSession.shared 
     let task = session.dataTask(with: request as URLRequest) { data, response, error in 
      if error != nil 
       // Handle error… 
       /* 
       func sendError(_ error: String) { 
       print(error) 
       let userInfo = [NSLocalizedDescriptionKey : error] 
       completionHandlerForGET(nil, NSError(domain: "taskForGETMethod", code: 1, userInfo: userInfo)) 
       */ 

       return 
      } 
      completionHandler(true,nil) 
      let range = Range(5..<data!.count) 
      let newData = data?.subdata(in: range) /* subset response data! */ 
      print(NSString(data: newData!, encoding: String.Encoding.utf8.rawValue)!) 
     } 
     task.resume() 
     } 
+1

ありがとうございました!それはトリックをしたように見えます! :) –

+0

このソリューションのif文は元のコードとは逆ですが、残りのクロージャを非意味にする 'error!= nil'ではなく' error == nil'となります。 また、ログインが成功した場合にのみ機能し、ログインに失敗したときに同じバグが発生します。 より完全なソリューションを確認するには、私のソリューションをチェックしてください:https://stackoverflow.com/a/45026732/1415898 – Thomas

0

のような機能:

これは、このようなものでなければなりませんUdacityClient.swiftsucessブロック/クロージャescapes。だから、

UdacityClient.sharedInstance().loginWithUsername(emailTextField.text!, password: passwordTextField.text!){

関連する問題