Swift, как проверить, существует ли файл (.plist) на веб-сервере [дубликат]

Для достижения этого поведения вы должны использовать встроенный метод globals():

def var_of_var(k, v): globals()[k] = v print variable_name # NameError: name 'variable_name' is not defined some_name = 'variable_name' globals()[some_name] = 123 print variable_name # 123 some_name = 'variable_name2' var_of_var(some_name, 456) print variable_name2 # 456
2
задан mcfly soft 5 June 2015 в 07:13
поделиться

2 ответа

Проверка наличия ресурса на сервере требует отправки HTTP-запроса и получения ответа. TCP-связь может занять некоторое количество времени, например. если сервер занят, какой-то маршрутизатор между клиентом и сервером работает некорректно, сеть отключена и т. д.

Вот почему асинхронные запросы всегда предпочтительны. Даже если вы считаете, что запрос должен занимать всего миллисекунды, иногда это может быть секунды из-за некоторых сетевых проблем. И, как мы все знаем, блокировка главного потока в течение нескольких секунд - это большое значение no-no.

Все, что сказано, вот возможная реализация для fileExists() метод.

Метод HTTP-запроса установлен на «HEAD», так что сервер отправляет только заголовок ответа, но нет данных.

func fileExists(url : NSURL!) -> Bool {

    let req = NSMutableURLRequest(URL: url)
    req.HTTPMethod = "HEAD"
    req.timeoutInterval = 1.0 // Adjust to your needs

    var response : NSURLResponse?
    NSURLConnection.sendSynchronousRequest(req, returningResponse: &response, error: nil)

    return ((response as? NSHTTPURLResponse)?.statusCode ?? -1) == 200
}
4
ответ дан Martin R 20 August 2018 в 19:24
поделиться
  • 1
    Большое спасибо ! Я пытался. – mcfly soft 12 June 2015 в 11:42
  • 2
    Это работает для большинства веб-серверов, но у меня есть этот URL-адрес, и, если я проверю его, ответ всегда равен нулю. Я пробовал с HEAD, GET, POST и TRACE для HTTPMethod, но все равно это ноль. Если я удалю установщик HTTPMethod для запроса, тогда я получу объект ответа (конечно, без важного кода состояния), поэтому мой вопрос заключается в том, как проверить файл на этом веб-сервере? благодаря – stellz 19 March 2018 в 11:27

Swift 3.0 версия ответа Martin R написана асинхронно (основной поток не заблокирован):

func fileExistsAt(url : URL, completion: @escaping (Bool) -> Void) {
    let checkSession = Foundation.URLSession.shared
    var request = URLRequest(url: url)
    request.httpMethod = "HEAD"
    request.timeoutInterval = 1.0 // Adjust to your needs

    let task = checkSession.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
        if let httpResp: HTTPURLResponse = response as? HTTPURLResponse {
            completion(httpResp.statusCode == 200)
        }
    })

    task.resume()
}
3
ответ дан Mayur 20 August 2018 в 19:24
поделиться
  • 1
    В Swift 4.0 возможны следующие незначительные улучшения: func fileExistsAt (url: URL, завершение: @escaping (Bool) - & gt; Void) {let checkSession = URLSession.shared var request = URLRequest (url: url) request.httpMethod = & quot; ; ГОЛОВКА & Quot; request.timeoutInterval = 1.0 // Отрегулируйте ваши потребности let task = checkSession.dataTask (с: request) {(данные, ответ, ошибка) - & gt; Пустота, если пусть httpResp = response как? HTTPURLResponse {завершение (httpResp.statusCode == 200)}} task.resume ()} – gepree 25 November 2017 в 16:31
Другие вопросы по тегам:

Похожие вопросы: