问题描述
我正在我的应用中重构一个 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 (将#修改为@)