2017-02-22 1 views
0

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

+0

essayer le débogage 'viewDidLoad' et de voir ce qui se passe lors de la déclaration du délégué –

+0

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. –

+1

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

Répondre

0

votre code devrait ressembler à this.Because dans votre code d'abord vous init 'UtilsTCPClient' et ensuite assigner un délégué. Et dans 'UtilsTCPClient' vous créez 'TCPClient' et essayant d'accéder au délégué mais jusqu'à ce qu'il ne soit pas assigné ainsi vous devriez essayer le code ci-dessous.

 protocol ProtocolTCPClient { 
    func connexionSucceeded() 
} 

class UtilsTCPClient { 

    var delegate: ProtocolTCPClient? 

    let client: TCPClient? 

    init(address: String, port: Int32, delegate: ProtocolTCPClient) { 

     self.delegate = delegate 

     client = TCPClient(address: address, port: port) 

     switch client!.connect(timeout: 5) { 
     case .success: 
      print("Success") 
      if(delegate != nil){ 
       self.delegate?.connexionSucceeded() 
      } else{ 
       print("delegate nil") 
      } 
     case .failure(let error): 
      print("Error: ") 
      print(error) 
     } 

    } 


} 


class ViewController: UIViewController, ProtocolTCPClient { 

    var client: UtilsTCPClient? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.client = UtilsTCPClient(address: "server", port: 80, delegate: self) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func connexionSucceeded(){ 
     print("Connexion succeeded")//never called 
    } 
} 
+0

@yozzy est ce que le travail ou non ?? –

+0

Merci c'est bon :) – yozzy