SwiftNIO:如果代码在类中,则connect无法正常工作

时间:2019-10-03 10:03:45

标签: swift swift-nio

我刚开始使用SwiftNIO,并且第一次尝试使用以下代码:

let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let bootstrap = ClientBootstrap(group: group)
    // Enable SO_REUSEADDR.
    .channelOption(ChannelOptions.socket(SocketOptionLevel(SOL_SOCKET), SO_REUSEADDR), value: 1)
defer {
    try? group.syncShutdownGracefully()
}

do {
    let channel = try bootstrap.connect(host: "127.0.0.1", port: 1234).wait()
    try channel.closeFuture.wait()
} catch let error {
    print(error)
}

它可以正常工作,并且由于服务器未运行,我得到了打印错误。

但是,如果我将该代码带入类,则什么也不会发生:

class Client {

    let bootstrap: ClientBootstrap

    init() {
        let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
        self.bootstrap = ClientBootstrap(group: group)
            // Enable SO_REUSEADDR.
            .channelOption(ChannelOptions.socket(SocketOptionLevel(SOL_SOCKET), SO_REUSEADDR), value: 1)
        defer {
            try? group.syncShutdownGracefully()
        }
    }

    func connect(host: String, port: Int) throws {
        let channel = try self.bootstrap.connect(host: host, port: port).wait()
        try channel.closeFuture.wait()
    }
}

let client = Client()
do {
    try client.connect(host: "127.0.0.1", port: 1234)
} catch let error {
    print(error)
}

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

原始代码在什么情况下运行?在init方法中看到defer是很不寻常的,尤其是在结尾处-它会在init完成后立即执行,而原始代码中的defer将在之后执行执行do / catch块。

您可能希望关闭代码位于您的deinit类的Client方法中。