【问题标题】:Alamofire request or Firebase query is not working in a non UIViewController ClassAlamofire 请求或 Firebase 查询在非 UIViewController 类中不起作用
【发布时间】:2020-04-03 16:23:30
【问题描述】:

Imperial 尝试使用 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)

                    ......

如果我在 swift (non cocoa touch) 类的私有函数中重复相同的代码,那么,我没有响应,在调试时它尝试执行请求任务两次,然后跳出 {response in code块。

代码如下:

 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 类(即 swift 普通类)的调用要求连接到网页。如果响应良好,则获得一个真值并继续该过程。

被调用的函数有一个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 等来解析响应。但是如果我这样做,我就无法做到。

再次感谢

【问题讨论】:

  • 显示调用checkInWithAeA()的代码,该变量是不是发布得太早了?
  • 我想要的是重新注册(使用 firebase)。要完成注册过程,我需要用户名和密码才能连接到其他网站并下载一些数据。我所做的是调用 myController (plain swit) 并检查 cookie。如果 coockies 是好的,则返回 bool true 以注册 firebase.Call: var myConnectionController: ConnectionController = ConnectionController() let (companyUSerRecognized, error) = myConnectionController.chekUserIDandPassWord(forTheCompany: self.companyName, logInName: self.companyLogIn ,密码:self.companyPassword)
  • CheckUserIDandPassWord 函数是这个 [public func chekUserIDandPassWord(forTheCompany: String, logInName: String, password: String) -> (Bool, String){ var companyUSerRecognized: Bool!变量错误:字符串! switch forTheCompany { case "(AEA)": companyUSerRecognized = checkInWithAeA(withLogIn: logInName, password: password) break]
  • 我已经编辑了问题以添加代码。很抱歉在评论中添加了如此 Manu 代码

标签: swift firebase cocoa-touch uiviewcontroller alamofire


【解决方案1】:

我最终通过查阅一些参考书目来提出解决方案。我没有注意到,任何 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) 完成(真) }别的{ 完成(假) } } }

就是这样。希望对你有帮助

顺便说一句。我认为这与 firebase 查询存在相同的问题。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多