我正在使用 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 发回。
我想过添加超时,但这似乎有点老套。有更好的解决办法吗?
您可能正在使用 HTTP/1.1。这些会话不会自动关闭。这是一种性能优化,以便可以重用(昂贵的)连接。您需要解析 HTTP 以确定请求何时完成。有关如何针对不同类型的请求确定此长度的详细信息,请参阅第 4.4 节消息长度。一般来说,您将解析
Content-Length
字段。