如何解决URLSession 响应有线问题
我正在我的应用中重构一个 API 请求,旧版本是由旧框架 ASI http request
编写的。
api 是一个 GET
请求,但是通过一些脚本字符串响应不断获取数据,这永远不会调用完成块。
我正在尝试使用 URLSession to replace
旧的 ASI
框架。并继续以 URLSessionDataDelegate
方法获得响应。
这是我的URLSession code
:
func connect(server: String,delegate: URLSessionDataDelegate) {
guard let url = URL(string: server) else {
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
let queue = OperationQueue()
queue.qualityOfService = .background
let session = URLSession(configuration: URLSessionConfiguration.default,delegate: delegate,delegateQueue: queue)
let task = session.dataTask(with: request)
task.resume()
}
然后
class PushServerManager {
//Call connect here
func xxx() {
connect(server: xxx,delegate: self)
}
}
extension PushServerManager: URLSessionDataDelegate {
func urlSession(_ session: URLSession,dataTask: URLSessionDataTask,didReceive data: Data) {
guard let response = String(data: data,encoding: String.Encoding.utf8) else {
return
}
print(response)
}
response
是一些脚本标签,例如:
<script> xxxx </script>
<script> xxxx </script>
<script> xxxx </script>
<script> xxxx </script>
<script> xxxx </script>
然后我通过以下方式解析响应:
func parseScriptTag(content: String) -> [String] {
guard let expression = try? NSRegularExpression(pattern: "<script>(.*?)</script>") else {
return []
}
let range = NSRange(location: 0,length: content.count)
let matches = expression.matches(in: content,options: [],range: range)
let results = matches.enumerated().map { match -> String? in
if let matchRange = Range(match.element.range,in: content) {
return String(content[matchRange])
} else {
return .none
}
}
let aaa = results.compactMap { $0 }
return aaa
}
一切看起来都很完美,但响应中有很多 <script> xxx </script>
行。用我的 parseScriptTag
我总是错过最后 3 或 4 行非常重要的状态信息。我非常仔细地检查了脚本响应,似乎最后 3 或 4 行没什么特别的。如下图,从 97 到 100 都漏掉了。
<script> 1xxxx </script>
<script> 2xxxx </script>
<script> 3xxxx </script>
<script> 4xxxx </script>
<script> 5xxxx </script>
...
<script> 97xxxx </script>
<script> 98xxxx </script>
<script> 99xxxx </script>
<script> 100xxxx </script>
返回旧版本的ASI http请求,在ASI接收数据方法中实现:
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data {
}
数据响应两次,一次是从 1 到 96,第二次是从 97 到 100。
然后我想知道我使用中的 response
的 URLSession
是否以某种方式被覆盖了?那就是当两个响应一个接一个地很快出现然后Data
改变了?
有什么帮助吗?谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。