方法监听 URLSessionWebSocketTask,无需递归

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

调用时,

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)
        }
    }
}

但问题是,这样的递归会不会导致栈溢出,不使用递归是否可以实现这个逻辑?

swift recursion websocket infinite-recursion urlsessionwebsockettask
1个回答
0
投票

你问:

这个递归会导致堆栈溢出吗?

不,这不会导致堆栈溢出(因为递归调用是在异步完成处理程序中)。

是否可以不用递归来实现这个逻辑?

如果你想消除递归,你可以使用

receive
的Swift并发演绎,然后你就得到了一个没有递归的简单循环:

func receiveMessages(for socket: URLSessionWebSocketTask) async throws {
    while true {
        let message = try await socket.receive()
        …
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.