URLSessionWebSocketTask.receive(completionHandler:)
的方法仅接收一条消息。
所以为了继续接收消息,我需要一次又一次地调用这个方法。使用递归可以轻松实现这一点:
private func listen(completion: @escaping ((Error) -> Void)) {
guard let task, !task.isCancelled else { return }
task.receive { [weak self] result in
switch result {
case let .success(message):
self?.handle(message: message)
self?.listen(completion: completion)
case let .failure(error):
completion(error)
}
}
}
但问题是,这样的递归会不会导致栈溢出,不使用递归是否可以实现这个逻辑?
你问:
这个递归会导致堆栈溢出吗?
不,这不会导致堆栈溢出(因为递归调用是在异步完成处理程序中)。
是否可以不用递归来实现这个逻辑?
receive
的Swift并发演绎,然后你就得到了一个没有递归的简单循环:
func receiveMessages(for socket: URLSessionWebSocketTask) async throws {
while true {
let message = try await socket.receive()
…
}
}