J'ai travaillé avec la bibliothèque SwiftSocket pour envoyer des messages à mon serveur. Lorsque la connexion est établie, je veux créer un rappel pour attraper les résultats. Mais mon protocole est toujours nul et le callback n'est pas envoyé.Utiliser un protocole entre une classe et un contrôleur de vue Swift 3
C'est ma classe TcpClient:
protocol ProtocolTCPClient {
func connexionSucceeded()
}
class UtilsTCPClient {
var delegate: ProtocolTCPClient?
let client: TCPClient?
init(address: String, port: Int32) {
client = TCPClient(address: address, port: port)
switch client!.connect(timeout: 5) {
case .success:
print("Success")
if(delegate != nil){
self.delegate?.connexionSucceeded()//never called
} else{
print("delegate nil")
}
case .failure(let error):
print("Error: ")
print(error)
}
}
}
Ceci est mon ViewController
import UIKit
import SwiftSocket
class ViewController: UIViewController, ProtocolTCPClient {
var client: UtilsTCPClient?
override func viewDidLoad() {
super.viewDidLoad()
self.client = UtilsTCPClient(address: "server", port: 80)
self.client?.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func connexionSucceeded(){
print("Connexion succeeded")//never called
}
}
Merci pour vos réponses
essayer le débogage 'viewDidLoad' et de voir ce qui se passe lors de la déclaration du délégué –
pourrait être votre fermeture de connexion TCPClient appelé avant d'attribuer délégué. Réécrivez l'init pour envoyer un délégué dans init lui-même. –
Il semble que votre 'client! .connect (timeout: 5)' soit synchrone, donc il va bloquer le thread dans l'initialiseur. Cela signifie que le délégué ne sera pas défini avant que la méthode connect ne soit exécutée et renvoyée. Vous devez utiliser les opérations de réseau asynchrones – Paulw11