Запрос Alamofire или запрос Firebase не работает в не UIViewController Class - PullRequest
0 голосов
/ 03 апреля 2020

Imperial пытается выполнить запрос к веб-сайту с использованием alamofire, и моя проблема заключается в следующем:

Когда я использую соответствующий код в функции ViewController класса CocoaTOuch viewDidLoad (), все работает нормально. code)

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.

Есть ли какие-либо ограничения на это. Почему я не могу сделать что-либо вроде запроса alamofire или запроса firebase к базе данных реального времени из класса UIViewController?

Здесь я добавляю некоторую информацию:

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

Этот вызов к классу ConnectionController (это быстрый простой класс) просит подключения к веб-странице. Если ответ хороший, то получается истина и процесс продолжается.

Вызываемая функция имеет оператор 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

.....

Это то, что называется Check In With AeA. (Функция, которую я только что упомянул ранее). То, что я хочу, это получить куки соединения в ответ, проверить их, и если они в порядке, возвращается true.

Я уже сделал это в функции viewDidLoad () ViewController, на самом деле я могу проанализируйте ответ с помощью SwiftSoup, et c. Но если я сделаю это таким образом, я не смогу это сделать.

Еще раз спасибо

1 Ответ

0 голосов
/ 06 апреля 2020

Я наконец нашел решение, просмотрев библиографию. Я не заметил, что любой вызов alamofire открывает конвейер. То есть мы явно говорим об асинхронных операциях. Существует два способа обработки операций такого типа в Swift. Одним из них является использование будущих объектов. Эта опция позволяет продолжить выполнение, подставляя результаты асинхронного вызова c, когда они будут готовы. В зависимости от ситуации это не так хорошо. Другой - заставить выполнение ждать ответа асинхронного вызова c. Это сделано с закрытием. Я взял это последнее объяснение.

Чем ближе, тем ниже будет функция обработчика завершения, которая вызывается в конце блока вызова asyn c, чтобы вернуть любое значение, которое вам нужно из вызова asyn c. , В этом случае. Это то, что я назвал завершением

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? .SetCook ie (cookieToSend) завершение (истина)} else {завершение (ложь)} }}

Вот и все. Надеюсь, это поможет

Кстати. Я думаю, что это та же проблема с запросами Firebase.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...