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。

然后我想知道我使用中的 responseURLSession 是否以某种方式被覆盖了?那就是当两个响应一个一个地很快出现然后Data改变了?

有什么帮助吗?谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)