Swift - 代理协议结构 [英] Swift - Delegate Protocol structure
问题描述
代表班
import Alamofire
协议ServletDelegate {
func responseSuccess(sender:Servlet,respArray:[String])
func responseFail(sender:Servlet,respArray :[String])
}
class Servlet:UIViewController {
var delegate:ServletDelegate?
// form'data'参数
Alamofire.request(.POST,Config.flURL,参数:[data:])。
print(response \(response.response))
print(result)
打印(request \(response.request))
print \(response.result))
print(data \(response.data))
let responseData = NSString(data:response.data !, encoding:NSUTF8StringEncoding)
result =(responseData?.componentsSeparatedByString(〜z0 @))!
print(responseData:\(responseData));
print(result:\(result));
self.delegate?.responseSuccess(self,respArray:result);
}
主类
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));
}
}
首先你的servlet类不应该是一个UIViewController,第二个 - 不要使用;迅速的多余的,第三个你没有设置代表,第四个代表应该是弱的,所以你不会遇到强的循环,第五我没有看到理由通过发件人
顺便说一句,你可能应该传递一些错误对象与响应失败的委托,但这取决于你
委派类
import Alamofire
协议ServletDelegate:class {
func responseSuccess(respArray:[String])
func responseFail(respArray:[String])
}
class Servlet {
weak var delegate:ServletDelegate?
// form'data'参数
Alamofire.request(.POST,Config.flURL,参数:[data:])。
print(response \(response.response))
print(result)
打印(request \(response.request))
print \(response.result))
print(data \(response.data))
let responseData = NSString(data:response.data !, encoding:NSUTF8StringEncoding)
result =(responseData?.componentsSeparatedByString(〜z0 @))!
print(responseData:\(responseData))
print(result:\(result))
self.delegate ?resresonseSuccess (respArray:result)
}
主类
class LoginViewController:UIViewController,UITextFieldDelegate,ServletDelegate {
let servlet = Servlet()
@IBAction func submitBtnAction(sender:UIButton){
///我猜你知道你在做什么,因为我们没有看到你的LoginUserHttp在你的Servlet代码
servlet.LoginUserHttp(tfUsername.text !, userPassword:tfPassword.text!)
}
覆盖func viewDidLoad(){
servlet.delegate = self
}
func responseSuccess(respArray:[String]){
print(responseSuccess:\(respArray))
}
func responseFail(respArray:[String]){
print(responseFail:\(respArray))
}
}
Forgive me for being fairly new to swift. I wanted to create a delegate that used to "POST" request and get response from server. Then pass the parameters returned from server into func and allows my main class to response accordingly. Below is my delegate and my main class. It did not print out response log in LoginViewController class. I'm kinda lost and not much idea where it went wrong. Suggestions / pointers on how can I get this to work or better way on doing this is highly appreciated. Thanks!
Delegate class
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("~z0@"))!
print("responseData :\(responseData)");
print("result :\(result)");
self.delegate?.responseSuccess(self, respArray: result);
}
Main Class
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)");
}
}
First of all your servlet class shouldnt be a UIViewController, second - don't use ; in swift its redundant, third you didn't set the delegate, fourth yeah delegate should be weak so that you dont run into strong ref cycle, fifth i don't see a reason to pass the sender
By the way you probably should pass some error object with the response failed delegate, but thats up to you
Delegate class
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("~z0@"))!
print("responseData :\(responseData)")
print("result :\(result)")
self.delegate?.responseSuccess(respArray: result)
}
Main Class
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)")
}
}
这篇关于Swift - 代理协议结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!