swift URLSessionの拡张(URLSession#synchronousDataTask,URLSession #retryDataTask)ref:http://qiita.com/to

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift URLSessionの拡张(URLSession#synchronousDataTask,URLSession #retryDataTask)ref:http://qiita.com/to相关的知识,希望对你有一定的参考价值。

extension URLSession {

    /*
     * synchronousDataTask
     * 
     * Httpデータを同期的に取得します。スレッドをブロックするので使用に注意してください。
     */

    func dataTask(with request:URLRequest) -> (data:Data?, response:URLResponse?, error:Error?) {
        let semaphore = DispatchSemaphore(value: 0)
        var _dat : Data?
        var _res : URLResponse?
        var _err : Error?
        self.dataTask(with: request) { dat, res, err in
            _dat = dat; _res = res; _err = err
            semaphore.signal()
        }.resume()
        _ = semaphore.wait(timeout: .distantFuture)
        return (_dat, _res, _err)
    }

    func synchronousDataTask(with url:URL) -> (data:Data?, response:URLResponse?, error:Error?) {
        return self.synchronousDataTask(with: URLRequest(url: url))
    }

    /*
     * retryDataTask
     * 
     * Httpデータ取得に失敗た場合に再度取得を試みます。取得に成功するまでtimesで指定した回数の再取得を試みます。
     */

    func retryDataTask(withRequest request:URLRequest, times num:Int=50, wait usec:useconds_t=200*1000, errorHandler:@escaping (Int, Error) -> ()={_,_ in}, completionHandler:@escaping (Data?, URLResponse?, Error?) -> ()) -> URLSessionDataTask {
        return self.dataTask(with: request) { dat, res, err in
            if let err = err, num > 0 {
                errorHandler(num, err)
                usleep(usec)
                self.retryDataTask(withRequest: request, times: num-1, wait: usec, errorHandler: errorHandler, completionHandler: completionHandler).resume()
            } else {
                completionHandler(dat, res, err)
            }
        }
    }

    func retryDataTask(withURL url:URL, times num:Int=50, wait usec:useconds_t=200*1000, errorHandler:@escaping (Int, Error) -> ()={_,_ in}, completionHandler:@escaping (Data?, URLResponse?, Error?) -> ()) -> URLSessionDataTask {
        return self.retryDataTask(withRequest: URLRequest(url: url), times: num, wait: usec, errorHandler: errorHandler, completionHandler: completionHandler)
    }
}
let url = URL(string: "http://localhost:8080/")!

let result = URLSession.shared.dataTask(with: url)

print( result.data, result.response, result.error )
print("complete.")
let url = URL(string: "http://localhost:8080/")!

// 単純データ取得

func get() {
    URLSession.shared.retryDataTask(withURL: url) { dat, _, _ in
        if let dat = dat, let body = String(data: dat, encoding: .utf8) {
            print(body)
        }
    }.resume()
}

// リトライを最大30回繰り返し。取得失敗の度にエラー情報を出力する。

let numberOfTimes = 30

func displayIndicator(count:Int, error:Error) {
    print("times:\(count)/\(numberOfTimes)")
    print(error)
}

func status() {
    URLSession.shared.retryDataTask(withURL: url, times: numberOfTimes, errorHandler: displayIndicator) { dat, res, err in
        if dat == nil, res == nil, let error = err {
            print(error)
        } else if let dat = dat, let response = res, err == nil, let body = String(data:dat, encoding:.utf8) {
            print(response)
            print(body)
        }
    }.resume()
}

以上是关于swift URLSessionの拡张(URLSession#synchronousDataTask,URLSession #retryDataTask)ref:http://qiita.com/to的主要内容,如果未能解决你的问题,请参考以下文章

java ファイルの拡张子を検证する

sh ファイルの拡张子一括変换.SH

sh ファイル名の拡张子を一括変换する

apache_conf URLの拡张子を「的.html」に统一する。

markdown sedコマンドの拡张正规表现オプションで非法选项 - rエラー

sql SQLServer的のDBのトランザクションログの拡张履歴を调べるSQLファイル