【发布时间】: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