2017-02-22 53 views
0

我使用库SwiftSocket将消息发送到我的服务器。当连接建立时,我想创建一个回调来捕获结果。但我的协议总是空的,回调不发送。在类和视图控制器之间使用协议Swift 3

这是我的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) 
     } 
    } 
} 

这是我的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 
    } 
} 

谢谢你的答案

+0

尝试调试'viewDidLoad'并查看在声明委托时发生的情况 –

+0

可能是您在分配委托之前调用的TCPClient连接闭包。重写init在init本身中发送委托。 –

+1

看起来你的'client!.connect(timeout:5)'是同步的,所以它会阻塞初始化程序中的线程。这意味着直到connect方法执行并返回后才能设置委托。你应该使用异步网络操作 – Paulw11

回答

0

你的代码应该看起来像this.Because在你的代码首先你init'UtilsTCPClient',然后分配委托。在'UtilsTCPClient'中创建'TCPClient'并尝试访问委托,但直到它没有被分配,所以你应该尝试下面的代码。

 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是否工作? –

+0

谢谢你好:) – yozzy

相关问题