2017-02-22 54 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

相關問題