Alamofire请求或Firebase查询在非UIViewController类中不起作用

问题描述 投票:0回答:1

帝国尝试使用alamofire向网站执行请求,而我的问题如下:

[当我在ViewController cocoaTOuch类的viewDidLoad()函数中使用相应的代码时,一切正常。(这里是代码)

super.viewDidLoad()
    let loginActionUrl = url

    do{
        let parameters = [
            "p_user":user,
            "p_password": password
        ]

        AF.request(loginActionUrl, method: .post, parameters: parameters).responseJSON
            {response in
                if let header = response.response?.allHeaderFields as? [String: String],
                    let responseUrl = response.request?.url{
                    let sessionCookies = HTTPCookie.cookies(withResponseHeaderFields: header, for: responseUrl)

                    ......

[如果我在快速(非可可触摸)类的私有函数中重复相同的代码,则我没有响应,在调试时它尝试执行两次请求任务,然后跳出{代码块中的响应。

代码如下:

 private func checkInWithAeA(withLogIn: String, password: String) -> (Bool){
    var companyUSerRecognized: Bool = false
    var startIndex: String.Index!
   let loginActionUrl = url
    do{
    let parameters = [
        "p_user" : withLogIn,
        "p_password": password
    ]


    AF.request(loginActionUrl, method: .post, parameters: parameters).responseJSON
        {response in

            if let header = response.response?.allHeaderFields as? [String: String],
                                    let responseUrl = response.request?.url{
                let sessionCookies = HTTPCookie.cookies(withResponseHeaderFields: header, for: responseUrl)
                companyUSerRecognized = true
......

我现在不知道发生了什么,但这是我第二次遇到相同的问题。我正在努力避免按照最佳实践使用其他支持类在viewController中设置太多代码,但是我已经尝试使用firebase做到这一点,而且我遇到了同样的问题,仅查询数据库(确实)在UIViewcontroller类中工作,现在是一样的,当我执行干净的swift文件中的代码时,我无法获得任何结果。

对此有任何限制吗?为什么我不能通过UIViewController类对实时数据库执行alamofire请求或firebase查询之类的操作?

我在这里添加一些信息:

  var myConnectionController: ConnectionController = ConnectionController()
                let (companyUSerRecognized, error) = myConnectionController.chekUserIDandPassWord(forTheCompany: self.companyName, logInName: self.companyLogIn, password: self.companyPassword)

对ConnectionController类(这是一个快速的普通类)的此调用要求与网页的连接。如果响应良好,则为true,然后继续执行该过程。

被调用的函数具有switch语句:

 public func chekUserIDandPassWord(forTheCompany: String, logInName: String, password: String) -> (Bool, String){
    var companyUSerRecognized: Bool!
    var error: String!

    switch forTheCompany {
    case "(AEA)":
        companyUSerRecognized = checkInWithAeA(withLogIn: logInName, password: password)
        break

.....

这就是“使用AeA签入”。 (我刚才提到的功能)。我想要得到的是连接的cookie,以换取检查它们,如果它们很好,则返回true。

我已经在ViewController的viewDidLoad()函数中完成了此操作,实际上我可以使用SwiftSoup等解析响应。但是如果我这样做,我将无法做到。

再次感谢

swift firebase cocoa-touch uiviewcontroller alamofire
1个回答
0
投票

我终于通过回顾一些书目来弥补这个问题。我没有注意到,任何alamofire调用都会打开管道。也就是说,我们显然在谈论异步操作。快速处理这种操作有两种方法。一种是使用未来的对象。此选项允许通过在异步调用的结果准备好后替换结果来继续执行。根据情况,这不是很好。另一个是使执行等待异步调用的响应。这是通过闭包完成的。我采取了这个最后的选择。

通过使用在异步调用块末尾调用的完成处理程序函数来执行更近的操作,以从异步调用返回所需的任何值。在这种情况下。这就是我所说的完成

private func checkInWithAeA(completion: @escaping (Bool)-> Void){
    let loginActionUrl = url1
    let postLoginUrl = url2
   let parameters = [
       "p_user" : logInName,
       "p_password": password
   ]

    AF.request(loginActionUrl, method: .post, parameters: parameters).responseData
               {(response) in
                if let header = response.response?.allHeaderFields as? [String: String],
                let responseUrl = response.request?.url{
                let sessionCookies = HTTPCookie.cookies(withResponseHeaderFields: header, for: responseUrl)
                    let cookieToSend = sessionCookies[0]

//调试打印(cookieToSend)AF.session.configuration.httpCookieStorage?.setCookie(cookieToSend)完成度(true)}其他{完成(false)}}}

就是这样。希望对您有所帮助

顺便说一句。我认为这与Firebase查询是相同的问题。

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.