2017-12-04 5 views
0

나는 클래스가 db_conn을 불러 craeted 한이 calass 내부 I는 다음과 같은 기능이 있습니다내 함수가 String을 반환하지만 구문 분석 할 수 없습니까? 왜 어떤 생각?

public func login (email : String , password : String) -> String { 
    var result = "" 
    let url = URL(string: API.url_login.rawValue)! 
    var request = URLRequest(url: url) 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    request.httpMethod = "POST" 
    let postString = "email=\(email)&password=\(password)" 
    request.httpBody = postString.data(using: .utf8) 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 


     guard let data = data, error == nil else { 
      print("error=\(String(describing: error))") 
      return 
     } 

     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("\(String(describing: response))") 
     } 

     let responseString = String(data: data, encoding: .utf8) 
     result = String(responseString!) 
     //print("responseString = \(responseString!)") 
    } 
    task.resume() 


    return result 
} 

다음 내 로그인의 ViewController 클래스에 내가 ==처럼 사용하려고를>

@IBAction func login_button_action(_ sender: UIButton) { 

     let email = email_text.text 
     let passw0rd = password_text.text 


     if (email != "" && passw0rd != ""){ 
      let db_connect = db_conn() 
      if (db_connect.login(email: email!, password: passw0rd!) == nil){ 

       print("it's empty ") 

      }else { 

       print("not empty \(db_connect.login(email: email!, password: passw0rd!))") 

      } 


     }else { 

      let alert = UIAlertController(title: "Error", message: "Dont leave any of the spaces blank , they all must be filled up , try again ! ", preferredStyle: .alert) 
      alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
      self.present(alert, animated: true, completion: nil) 
     } 

때 나는 그것이 db_connect.login(email: email!, password: passw0rd!)에 대한 값은 비어 있지 않지만 그것을 인쇄하지 않는다고 말하는 프로젝트를 실행합니다. (그러나 내 db_conn CALSS 내가 쉽게 responseString을 인쇄 할 수 있습니다 내가 문자열 형식으로 반환 된 JSON을 얻을. 어떤 생각을 내가 실수를하고 어디에? 그리고 나는 아마도 문제를 해결할 수있는 방법?

+2

비동기 처리에 대해 알아보십시오 – rmaddy

+1

"Ho 나는 db_conn 함수를 사용하여 responseString을 쉽게 인쇄 할 수 있고 반환 된 JSON을 String 형식으로 얻을 수 있습니다. "결과를 반환하기 전에 인쇄를 추가하고 결과가 String (responseString!)인지 확인하십시오. 비동기 로직이 누락되었습니다. – Larme

답변

1

을 네트워크 요청 만들기 URLSession은 비동기 적으로 실행됩니다. 즉, iOS가 백그라운드 스레드에 배치하고 다운로드가 완료되기 직전에 현재 스레드를 계속 진행하므로, 사용자가 return result 일 때 여전히 빈 문자열입니다. login 메소드를 다운로드하고 다운로드가 완료되면 해당 데이터를 호출하십시오.

+0

응답 해 주셔서 감사합니다. 어떻게 제안했는지 이해할 수 있지만 어떻게해야하는지 잘 모릅니다. 나의 이해는 나의 login 함수 내에서'task = URLSession ...... '에 대한 것이지만 앞뒤로 전달하는 방법은 무엇입니까? ooo 개념을 고수하려고합니다.) –

+0

[다음과 같은 블로그 게시물을 볼 수 있습니다.] (https://www.bobthedeveloper.io/blog/completion-handlers-in-swift-with -단발) –