2014-12-25 3 views
-1

나는 데이터베이스를 쿼리하기 위해 PHP 웹 서비스를 사용하는 Swift 애플리케이션을 연구 중이다. 한 가지 문제 - 모델 클래스에서 데이터가 수신 된 시점을 알 수 없으므로 뷰를 업데이트 할 수 없습니다. 연결이 완료되었는지 어떻게 알 수 있습니까? 그런 다음보기를 업데이트합니까? 이를 위해 text라는 더미 레이블을 만들었습니다. 사전에 도움을 주셔서 감사합니다, 그리고 행복한 명절!NSURLConnection을 사용하여 데이터를받은시기를 어떻게 알 수 있습니까?

User.swift

import Foundation 

class User: NSObject { 

    var firstName: String? 
    var lastName: String? 
    var username: String 
    var password: String 
    var email: String? 

    var recievedJSON: NSMutableData = NSMutableData() 
    var userData: [[String: String]]! 

    var verified: Bool = false 

    required init(username: String, password: String) { 
     self.username = username 
     self.password = password 
    } 

    init(firstName: String, lastName: String, username: String, password: String, email: String) { 
     self.firstName = firstName 
     self.lastName = lastName 
     self.username = username 
     self.password = password 
     self.email = email 
    } 

    func attemptRegister() { 
     var variables: [String] = ["firstname=" + self.firstName! + "&"] 
     variables.append("lastname=" + self.lastName! + "&") 
     variables.append("username=" + self.username + "&") 
     variables.append("password=" + self.password + "&") 
     variables.append("email=" + self.email!) 
     request("https://codekaufman.com/register.php", variables: variables) 
    } 

    func attemptSignIn() { 
     var variables: [String] = ["username=" + self.username + "&"] 
     variables.append("password=" + self.password) 
     request("https://codekaufman.com/login.php", variables: variables) 
     println("Attempting sign-in...") 
    } 

    private func request(urlPath: String, variables: [String]?) { 
     var url: NSURL = NSURL(string: urlPath)! 
     var request: NSMutableURLRequest = NSMutableURLRequest(URL: url) 

     if(variables != nil) { 
      request.HTTPMethod = "POST" 

      var bodyData: NSString = "" 
      for item in variables! { 
       bodyData = bodyData + NSString(string: item) 
      } 

      request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding) 
     } 

     var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)! 
     connection.start() 
     println("Connection started.") 
    } 

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!){ 
     self.recievedJSON.appendData(data) 
     println("Possible data recieved.") 
    } 

    func connectionDidFinishLoading(connection: NSURLConnection!) { 
     userData = parseJSON(recievedJSON) 

     if(userData != nil) { 
      println("Data recieved:") 
      println(userData[0]) 
      self.firstName = userData[0]["first_name"] 
      self.lastName = userData[0]["last_name"] 
     } else { 
      println("No data recieved.") 
     } 

    } 

    func parseJSON(inputData: NSData) -> [[String: String]]? { 
     var error: NSError? 
     var userData: [[String: String]]! 
     userData = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as? [[String: String]] 

     #if DEBUG 

     if (userData != nil) { 
      println("NSData had data, printing and returning.") 
      println(userData) 
     } else { 
      println("NSData empty, returning nil.") 
     } 

     #endif 

     return userData 
    } 

} 

ViewController.swift

import UIKit 

class ViewController: UIViewController { 

    @IBAction func prepareForUnwind(seque: UIStoryboardSegue) { 

    } 

    @IBOutlet weak var username: UITextField! 
    @IBOutlet weak var password: UITextField! 
    @IBOutlet weak var text: UILabel! 

    @IBAction func signin(sender: AnyObject) { 
     if(username.text == "" || password.text == "") { 
      var alert = UIAlertController(title: "Error", message: "Invalid Credentials", preferredStyle: UIAlertControllerStyle.Alert) 
      alert.addAction(UIAlertAction(title: "Close", style: UIAlertActionStyle.Default, handler: nil)) 
      self.presentViewController(alert, animated: true, completion: nil) 
     } else { 
      var attempt: User = User(username: username.text, password: password.text) 
      attempt.attemptSignIn() 
     } 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 

} 

편집 : 이전 의견/응답에 따라, 나는 내가 명확히해야한다고 생각. 데이터를 받고 있습니다. 하지만 몇 초가 걸리므로 뷰 컨트롤러에 데이터가 수신되었음을 알리고 프로세스가 완료되었습니다.

당신이보기 컨트롤러에 알림을 추가 할 수 있습니다
+0

deinit에서 제거해야합니다

func addObserverForName(_ name: String?, object obj: AnyObject?, queue queue: NSOperationQueue?, usingBlock block: (NSNotification!) -> Void) -> NSObjectProtocol 

didReceiveData가 호출되지 않고 있습니까? –

+0

보기 컨트롤러가 등록한 'connectionDidFinishLoading'에서 알림을 보낼 수 있습니다. – zaph

+0

당신이 대답 할 수있는 의미의 예를 들어 주시겠습니까? – Jeffrey

답변

0

: 사용

func removeObserver(_ notificationObserver: AnyObject) 

connectionDidFinishLoading에서 통지를 보내기 :

func postNotificationName(_ notificationName: String, object notificationSender: AnyObject?, userInfo userInfo: [NSObject : AnyObject]?) 
관련 문제