-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()
}
}
편집 : 이전 의견/응답에 따라, 나는 내가 명확히해야한다고 생각. 데이터를 받고 있습니다. 하지만 몇 초가 걸리므로 뷰 컨트롤러에 데이터가 수신되었음을 알리고 프로세스가 완료되었습니다.
당신이보기 컨트롤러에 알림을 추가 할 수 있습니다
deinit에서 제거해야합니다
didReceiveData가 호출되지 않고 있습니까? –
보기 컨트롤러가 등록한 'connectionDidFinishLoading'에서 알림을 보낼 수 있습니다. – zaph
당신이 대답 할 수있는 의미의 예를 들어 주시겠습니까? – Jeffrey