Обратные вызовы AsyncSocket не вызываются в быстром классе

Делегаты GCDAsyncSocket не вызываются в классе swift, но очень хорошо работают в классе UIViewController. Ниже приведен мой пользовательский код класса, в этом классе функция подключения запустит подключение к сокету, и его делегат никогда не будет вызываться. Я ищу в сети, а также в репозитории GCDAsyncSocket github, но безуспешно.

class RXSocket: NSObject,GCDAsyncSocketDelegate {

func connect() {

    let asyncSocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue())

    do {
        try asyncSocket?.connectToHost("www.google.com", onPort: 80)
    } catch _ as NSError {
    }

}


//MARK:- ASyncSocket Delegate

func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) {
    print("didConnectToHost")
}

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
    print("didReceiveData")
}

func socketDidDisconnect(sock: GCDAsyncSocket!, withError err: NSError!) {
    print("socketDidDisconnect")
}

}

и в моем классе контроллера представления

    let rxSocket = RXSocket()
    rxSocket.connect()

person Community    schedule 02.06.2016    source источник
comment
попробуйте добавить @objc для каждого делегата func, также вам нужна сильная ссылка на ссылку, иначе она будет выпущена   -  person Wilson XJ    schedule 02.06.2016
comment
пытался, но не повезло.   -  person    schedule 02.06.2016
comment
проверьте первый комментарий, который я только что отредактировал   -  person Wilson XJ    schedule 02.06.2016
comment
В свифте я не знаю, как сделать сильную реф. Пожалуйста, предложите.   -  person    schedule 02.06.2016
comment
Вы решили этот вопрос?   -  person PascalS    schedule 10.04.2018
comment
Вы решили этот вопрос? Я столкнулся с той же проблемой   -  person kemdo    schedule 21.05.2018


Ответы (2)


Я столкнулся с той же проблемой и решил ее.

Ваш пример кода в порядке.

Причина того, что обратный вызов не работает, скорее всего, заключается в том, что ваш созданный объект (например, «rxSocket») не сохраняется после вызова connect().

Вот пример кода, который вызовет проблему

func testMyConnection() { 
    let rxSocket = RXSocket()
    rxSocket.connect()
}

Константа rxSocket становится недействительной, как только функция возвращает значение, поскольку rxSocket является локальным только для функции и уничтожается, когда выходит за пределы области видимости.

Решение состоит в том, чтобы сделать rxSocket объектом, который сохраняется после вызова connect(), поэтому он по-прежнему доступен, когда функции обратного вызова вызываются GDCAsyncSocket.

person helioz    schedule 06.01.2018

попробуйте так:

class RXSocket: NSObject,GCDAsyncSocketDelegate {
var asyncSocket: GCDAsyncSocket!
    func connect() {

    self.asyncSocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)

    do {
        try asyncSocket.connect(toHost: "www.google.com", onPort: 80)
    } catch _ as NSError {
        print("Catch")
    }
    }
}
person Wilson XJ    schedule 02.06.2016
comment
Не предоставлено никаких объяснений того, что не так с кодом в вопросе и почему он работает нормально в контроллере представления. Ответ не решает проблему. - person helioz; 07.01.2018