2016-01-22 160 views
1

原諒我對於swift來說相當新穎。我想創建一個用於「POST」請求並從服務器獲得響應的委託。然後將從服務器返回的參數傳遞給func,並允許我的主類相應地進行響應。下面是我的代表和我的主要班級。它沒有在LoginViewController類中輸出響應日誌。我有點失落,不知道它出錯的地方。建議/指示我怎樣才能得到這個工作或更好的方式來做到這一點高度讚賞。謝謝!Swift - 代理協議結構

Delegate類

import Alamofire 

protocol ServletDelegate { 

    func responseSuccess(sender: Servlet, respArray : [String]) 

    func responseFail(sender: Servlet, respArray : [String]) 
} 

class Servlet : UIViewController{ 

    var delegate:ServletDelegate? 

    //form 'data' parameter 


    Alamofire.request(.POST, Config.flURL, parameters:["data" : ""]).responseData { 
     response in 
     print ("request \(response.request)") 
     print ("response \(response.response)") 
     print ("result \(response.result)") 
     print ("data \(response.data)") 

     let responseData = NSString (data: response.data!, encoding: NSUTF8StringEncoding) 
     result = (responseData?.componentsSeparatedByString("[email protected]"))! 

     print("responseData :\(responseData)"); 
     print("result :\(result)"); 

     self.delegate?.responseSuccess(self, respArray: result); 

} 

主類所有的servlet類的

class LoginViewController: Servlet, UITextFieldDelegate, ServletDelegate { 

    @IBAction func submitBtnAction(sender: UIButton) { 

     Servlet().LoginUserHttp(tfUsername.text!, userPassword: tfPassword.text!); 

    } 

    func responseSuccess(sender: Servlet, respArray: [String]) { 
     print("responseSuccess: \(respArray)"); 
    } 

    func responseFail(sender: Servlet, respArray: [String]) { 
     print("responseFail: \(respArray)"); 
    } 

} 
+1

這裏有幾件事你做錯了。其中一個原因是因爲你沒有通過'LoginViewController'作爲'Servlet'中的委託。還要考慮讓你的協議確認類協議,這樣你的委託就不會被強引用(否則會阻止它被釋放)。 – Eendje

+0

謝謝你指出。 –

回答

3

首先不應該是一個UIViewController,第二 - 不要使用;在迅速其多餘的,第三你沒有設置代表,第四耶是代表應該是弱的,這樣你就不會遇到強大的參考週期,第五我沒有看到一個理由通過發件人

順便說一句,你或許應該通過與響應失敗委託一些錯誤的對象,但多數民衆贊成由你

Delegate類

import Alamofire 

protocol ServletDelegate: class { 

    func responseSuccess(respArray : [String]) 

    func responseFail(respArray : [String]) 
} 

class Servlet { 

    weak var delegate:ServletDelegate? 

    //form 'data' parameter 


    Alamofire.request(.POST, Config.flURL, parameters:["data" : ""]).responseData { 
     response in 
     print ("request \(response.request)") 
     print ("response \(response.response)") 
     print ("result \(response.result)") 
     print ("data \(response.data)") 

     let responseData = NSString (data: response.data!, encoding: NSUTF8StringEncoding) 
     result = (responseData?.componentsSeparatedByString("[email protected]"))! 

     print("responseData :\(responseData)") 
     print("result :\(result)") 

     self.delegate?.responseSuccess(respArray: result) 

} 

主類

class LoginViewController: UIViewController, UITextFieldDelegate, ServletDelegate { 


let servlet = Servlet() 

@IBAction func submitBtnAction(sender: UIButton) { 

/// im guessing you know what you are doing here, because we dont see that LoginUserHttp in your Servlet code   
servlet.LoginUserHttp(tfUsername.text!, userPassword: tfPassword.text!) 

    } 
override func viewDidLoad() { 
    servlet.delegate = self 
} 

func responseSuccess(respArray: [String]) { 
     print("responseSuccess: \(respArray)") 
    } 

    func responseFail(respArray: [String]) { 
     print("responseFail: \(respArray)") 
    } 

} 
+0

謝謝你指出我的錯誤。我試過你的解決方案,它的工作很好。 –