2016-01-22 161 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

谢谢你指出我的错误。我试过你的解决方案,它的工作很好。 –