Swift 4 - Alamofire - Как отключить кеш по запросу - PullRequest
0 голосов
/ 14 января 2020

У меня есть такой запрос Alamofire:

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
    {

        let user = username

        let password = password

        let url = webservice

        let credential = URLCredential(user: user, password: password, persistence: .none)

        let headers = ["Accept": "application/json;odata=verbose", "Content-type": "application/json;odata=verbose"]

        Alamofire.request(url, method: .get, headers: headers).authenticate(usingCredential: credential).responseJSON {
                (response) in

                print(response.result)

                switch response.result {

                case .success:
                    if let value = response.result.value {

                        completion(true)

                    }else{

                        print("There is error in the server response")

                        completion(false)
                    }

                case .failure (let error):

                    print("The NTLM request error is: ", error.localizedDescription)

                    completion(false)

                }

            }

    }

Моя проблема в том, что он работает, когда я использую недействительные учетные данные после использования действительных учетных данных, вместо того, чтобы выдавать ошибку. Мне сказали, что это может быть проблема с кешированием, поэтому мой вопрос - как отключить кеш для этого запроса?

Я пытался добавить это в начало моего запроса:

URLCache.shared.removeAllCachedResponses()

Но это не сработало

Я также видел это:

urlRequest.cachePolicy = .reloadIgnoringCacheData

Но я не знаю, где его применить.

Пожалуйста, помогите!

ОБНОВЛЕНИЕ

Я пробовал следующее:

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
    {

        let user = username

        let password = password

        let url = webservice

        let credential = URLCredential(user: user, password: password, persistence: .none)

        var urlRequest = URLRequest(url: URL(string: url)!)

        urlRequest.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

        urlRequest.httpMethod = "get"

        urlRequest.setValue("application/json;odata=verbose", forHTTPHeaderField: "Content-type")

        urlRequest.setValue("application/json;odata=verbose", forHTTPHeaderField: "Accept")

        Alamofire.request(urlRequest).authenticate(usingCredential: credential).responseJSON {
                (response) in

                switch response.result {

                case .success:
                    if let value = response.result.value {


                       completion(true)

                    }else{

                        print("There is error in the server response")

                        completion(false)
                    }

                case .failure (let error):

                    print("The NTLM request error is: ", error.localizedDescription)

                    completion(false)

                }

            }

    }

Но это не сработало, тот же результат.

1 Ответ

5 голосов
/ 14 января 2020

Вы можете создать экземпляр Alamofire.SessionManager с указанием c URLSessionConfiguration. В конфигурации вы можете установить cachePolicy. Это может выглядеть так:

let configuration = URLSessionConfiguration.default
configuration.requestCachePolicy = .useProtocolCachePolicy // or whatever you want
configuration.urlCache = nil
let mySessionManager = Alamofire.SessionManager(configuration: configuration)

и затем использовать его следующим образом:

mySessionManager.request(urlRequest) ....

Обратите внимание, что вы должны использовать mySessionManager делать запросы вместо использования Alamofire.request, если вы следуете этому.

Чтобы сделать запрос с помощью mySessionManager, он в основном совпадает с Alamofire.request(urlRequest) ... вы используете mySessionManager.request(urlRequest) ...

...