首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展URLRequest

如何扩展URLRequest
EN

Stack Overflow用户
提问于 2017-11-08 14:53:06
回答 2查看 2.3K关注 0票数 0

试图编写可维护、干净的代码的结果:

代码语言:javascript
复制
func fetchNumbersFromServer(completion: @escaping (NumbersResult) -> Void) {
    let urlString = "https://some-site.com/some-file"
    var request = URLRequest(url: URL.init(string: urlString)!)
    // I want to configure the request, yet make the code extenda
    request = URLRequest.configure(request: request)
    // create URLSession configuration, delegate and session
    ...
    session.dataTask(with: request) { (data, response, error) -> Void in
        // handle response
    }.resume()
}

extension URLRequest {

    static func configure(request: URLRequest) -> URLRequest {
        // request in must be made mutable
        var request = request
        request.setValue("some user agent", forHTTPHeaderField: "User-Agent")
        request.timeoutInterval = 10

        return request
    }

}

通过使用type方法,可以修改请求。但是,我觉得很尴尬,所以我想知道是否有一种更好(或更有效)的方法来完成URLRequest的“配置”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-08 15:34:14

您只需创建一个URLRequest自定义初始化程序,并为参数设置一个默认值:

代码语言:javascript
复制
extension URLRequest {
    init(_ url: URL, userAgent: String = "your default user agent", cachePolicy: CachePolicy = .useProtocolCachePolicy, timeInterval: TimeInterval = 60) {
        self.init(url: url, cachePolicy: cachePolicy, timeoutInterval: timeInterval)
        setValue(userAgent, forHTTPHeaderField: "User-Agent")
    }
}

struct NumbersResult { }

func fetchNumbersFromServer(request: URLRequest, completion: @escaping (NumbersResult) -> ()) {
    URLSession.shared.dataTask(with: request) { data, response, error  in
        // handle response
    }.resume()
}

let url = URL(string: "https://www.google.com")!
let request = URLRequest(url)  // you can also pass another userAgent, cachePolicy and timeInterval here if needed
fetchNumbersFromServer(request: request) { numbers in

}
票数 4
EN

Stack Overflow用户

发布于 2017-11-08 15:32:37

用以下方法怎么样?

更改当前实例:

代码语言:javascript
复制
mutating func configure(headers:[String: String], timeOutInterval: TimeInterval = 10) {
        for key in headers.keys {
            self.setValue(headers[key] ?? "", forHTTPHeaderField: key)
        }
        self.timeoutInterval = timeoutInterval

}

或者,返回新的副本:

代码语言:javascript
复制
func configure(headers:[String: String], timeOutInterval: TimeInterval = 10) -> URLRequest {
        var request = self
        for key in headers.keys {
            request.setValue(headers[key] ?? "", forHTTPHeaderField: key)
        }
        request.timeoutInterval = timeoutInterval
        return request

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47182754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档