2016-11-22 111 views
1

這是使用Singleton管理Swift 3套接字連接的正確方法嗎?Swift 3 Singleton Manager套接字連接

我在哪裏啓動套接字連接,以便我不必每次都在Viewcontroller生命週期中重新連接? Viewcontroller不斷地向我的服務器發送數據;我的應用程序是客戶端和它的收集數據;它從應用程序中獲取移動數據併發送方向,電源等。

我已經搜索和搜索,但找不到具體示例;我只找到套接字庫,但沒有關於如何將它與UIViewcontroller一起使用的例子;另外,網上的大多數例子都使用websockets,我不是

有什麼建議嗎?

我希望這將工作:

 manager.messageReceived(message: "Testing...") 

,但我擔心的是,UIViewController類裏面,它會自動重新啓動的連接;另外,我不確定在哪一點我應該檢查連接是否丟失以及再次連接的位置;因爲我從來沒有關閉套接字

感謝

單例類:

import Darwin 
import Foundation 

class ChatManager { 

    // Add property for socket 

    private var control_socket: Int32 
    private var address = "000.000.0.000" 
    private var port = "0000" 

    class var sharedInstance: ChatManager { 
     struct Singleton { static let instance = ChatManager() } 
     return Singleton.instance 
    } 

    init() { 
     // Create the socket 
     self.control_socket = connectToServer(atAddress: self.address, atPort: self.port) 

    } 

    func sendMessage(message: String) { 
     // Push the message onto the socket 
     _ = write(self.control_socket, message, message.characters.count) 
    } 

    // Delegate methods 

    func messageReceived(message: String) { 

     // Emit the message using NSNotificationCenter 
    } 
} 

的UIViewController:

import Darwin 
import Foundation 
import UIKit 
import Dispatch 

class ViewController: UIViewController { 

    @IBOutlet private weak var joystickMove: Joystick! 
    @IBOutlet private weak var joystickRotate: Joystick! 

    private var contour = Contours() 
    private var contour_index: Int = 0 

    private let manager = ChatManager.sharedInstance 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     createJoystick() 
     createContours() 
     createButton() 
    } 

    private func createJoystick() { 

     var joystick = Joystick() 

     let n: CGFloat = 100.0 
     let x: CGFloat = (UIScreen.main.bounds.width/2) - (n/2.0) 
     let y: CGFloat = UIScreen.main.bounds.height - (UIScreen.main.bounds.height/4.0) 

     joystick.frame = CGRect(x: x, y: y, width: n, height: n) 
     joystick.backgroundColor = UIColor.clear 

     joystick.substrateColor = UIColor.lightGray 
     joystick.substrateBorderColor = UIColor.gray 
     joystick.substrateBorderWidth = 1.0 
     joystick.stickSize = CGSize(width: 50.0, height: 50.0) 
     joystick.stickColor = UIColor.darkGray 
     joystick.stickBorderColor = UIColor.black 
     joystick.stickBorderWidth = 2.0 
     joystick.fade = 0.5 

     var packet = "" 

     joystick.trackingHandler = { (data) ->() in 

      let power = sqrt(pow(Double(data.velocity.x), 2.0) + pow(Double(data.velocity.y), 2.0)) 
      let theta = atan2(Double(-data.velocity.y), Double(data.velocity.x)) 
      let degrees = theta * (180.0/M_PI) 

      if degrees >= 55 && degrees <= 125 { // move forward 
       packet = "\(1) \(1) \(power) \(power)" 
      } else if degrees >= -125 && degrees <= -55 { // move backewards 
       packet = "\(-1) \(-1) \(power) \(power)" 
      } else if degrees >= -55 && degrees <= 55 { // turn right 
       packet = "\(1) \(-1) \(power) \(power)" 
      } else if (degrees >= 125 && degrees <= 180) && (degrees >= -180 && degrees <= -125) { // turn left 
       packet = "\(-1) \(1) \(power) \(power)" 
      } 

     } 

     manager.messageReceived(message: "Testing...") 

     view.addSubview(joystick) 
    } 
} 

回答

0

既然是單身,你有沒有考慮初始化在AppDelegate中的插槽經理應用功能?然後它將存在於應用程序的整個生命週期中。