NW连接和蜂窝数据,isComplete永远不会成为true

问题描述 投票:0回答:1

我正在使用 NWconnection 强制某些请求通过蜂窝数据。一切正常,除了我不断调用connection.receive并且不知道传输何时完成。

// Setting up the connection:
     let tcpOptions = NWProtocolTCP.Options()
     let parameters = NWParameters(tls: .init(), tcp: tcpOptions)
     parameters.requiredInterfaceType = .cellular
     port = port ?? NWEndpoint.Port(443)

// ...

   NWConnection(to: .hostPort(host: NWEndpoint.Host(host),port: port), using: parameters)

//...

    func receive(withConnection connection: NWConnection, completion: @escaping dataCompletion) {
        connection.receive(minimumIncompleteLength: 1, maximumLength: Int.max) { [self] data, contentContext, isComplete, error in
            if let data = data {                
                receivedData.append(data)                
                print(contentContext)
                if isComplete || error != nil  || connection.state != .ready {                    
                    cancelConnection(connection)
                } else {
                    processor?.receive(withConnection: connection, completion: completion)
                }
            } else {                
                cancelConnection(connection)
            }
        }
    }

我正在使用常规 HTTP 端点。 receive 中的数据以块的形式出现,但 isComplete 参数永远不会变为 true,所以我不知道何时停止并将完整的 receiveData 发回。

我想过添加超时,但这似乎有点老套。有更好的解决办法吗?

ios swift networking cellular-network
1个回答
0
投票

您可能正在使用 HTTP/1.1。这些会话不会自动关闭。这是一种性能优化,以便可以重用(昂贵的)连接。您需要解析 HTTP 以确定请求何时完成。有关如何针对不同类型的请求确定此长度的详细信息,请参阅第 4.4 节消息长度。一般来说,您将解析

Content-Length
字段。

© www.soinside.com 2019 - 2024. All rights reserved.