Swift - 代理协议结构 [英] Swift - Delegate Protocol structure

查看:117
本文介绍了Swift - 代理协议结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

原谅我是相当新的快速。我想创建一个用于POST请求并从服务器获取响应的委托。然后将从服务器返回的参数传递给func,并允许我的主类作出相应的响应。下面是我的代表和我的主要类。它没有在LoginViewController类中打印出响应日志。我很失落,不太了解哪里出错。建议/指针如何让这个工作或更好的方式这样做是非常感谢。谢谢!



代表班

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆