SwiftNIO: подключение не работает, если код находится в классе - PullRequest
0 голосов
/ 03 октября 2019

Я только начал с 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 голосов
/ 03 октября 2019

В каком контексте работает исходный код? Необычно видеть defer в методе init, особенно в конце - он будет выполнен, как только завершится init, тогда как отсрочка в вашем исходном коде будет выполнена после do /выполняется блок catch.

Возможно, вы хотите, чтобы код завершения был в методе deinit вашего Client класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...