【发布时间】:2018-07-20 20:37:41
【问题描述】:
我刚开始使用委托和协议,我认为它非常有用。在我的项目中,当我尝试委托给 ViewController 时,它工作得很好,因为它不适用于我创建的其他类。我不明白为什么。我尝试将数据从类 ServerArtNet 传输到类 FixtureControl。但它不起作用。你知道为什么吗?
服务器艺术网
protocol ArtNetDelegate: class {
func receivedFixtureControll(intS: Float, StrobeS:Float, Red: Float, Green: Float, Blue: Float)
}
class ServerArtNet: NSObject {
weak var delegate:ArtNetDelegate?
let serverUDP = ServerUDP()
func artNetReceive (data:Data) {
let DMX_Universe_Bytes: [UInt8] = [DMX_Universe, 0]
var received = [UInt8]()
received.append(contentsOf: data)
if (received.count > 17) {
let number_of_received_chanel = (UInt16(received[17]<<8) + UInt16(received[16]))
if (received[0...6] == ArtNetHead[0...6]) && (received[7...11] == OpOutput[0...4]) && (received[14...15] == DMX_Universe_Bytes[0...1]) && number_of_received_chanel>0 {
let intensityScreen:Float = received[18].fromDMX()
let shutter:Float = received[19].fromDMX()
let red:Float = received[20].fromDMX()
let green:Float = received[21].fromDMX()
let blue:Float = received[22].fromDMX()
delegate?.receivedFixtureControll(intS:intensityScreen,StrobeS:shutter, Red: red, Green: green, Blue: blue)
}
}
}
}
夹具控制
import UIKit
class FixtureControll: NSObject {
let serverArtNet = ServerArtNet()
override init() {
super.init()
serverArtNet.delegate! = self
}
func Fixture(intS: Float, strobS:Float, red:Float, green:Float, blue:Float) {
// Working with data
}
}
extension FixtureControll: ArtNetDelegate {
func receivedFixtureControll(intS: Float, StrobeS:Float, Red: Float, Green: Float, Blue: Float) {
Fixture(intS: intS, strobS: StrobeS, red: Red, green: Green, blue: Blue)
}
}
服务器UDP
import UIKit
import CocoaAsyncSocket
protocol ServerUDPDelegate: class {
func receiveData(data: Data, address: String)
}
class ServerUDP: NSObject, GCDAsyncUdpSocketDelegate {
weak var delegate: ServerUDPDelegate?
let IP = "255.255.255.255"
let destinationIP = "255.255.255.255"
let PORT:UInt16 = 6454
var socket:GCDAsyncUdpSocket!
override init() {
super.init()
setupConnection()
}
func setupConnection(){
socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)
do {
try socket.bind(toPort: PORT)
}
catch {
print("Binding error: ", error.localizedDescription)
}
do {
try socket.beginReceiving()
}
catch {
print("Connecting error: ", error.localizedDescription)
}
do {
try socket.enableBroadcast(true)
}
catch {
print("brodcust error: ", error.localizedDescription)
}
}
func StopServer() {
socket.close()
}
// Receiving data from port
func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext withFilterContex: Any?) {
// print("DID RECEIVE DATA")
// Convert NSData to string to get Address info
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
do {
try address.withUnsafeBytes { (pointer:UnsafePointer<sockaddr>) -> Void in
guard getnameinfo(pointer, socklen_t(address.count), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 else {
throw NSError(domain: "domain", code: 0, userInfo: ["error":"unable to get ip address"])
}
}
} catch {
print(error)
return
}
let senderAddress = String(cString:hostname)
delegate?.receiveData(data: data, address: senderAddress)
}
}
扩展
extension ViewController: ServerUDPDelegate {
func receiveData(data: Data, address: String) {
serverArtNet.artNetReceive(data: data)
}
}
视图控制器
import UIKit
import AVFoundation
import AudioToolbox
class ViewController: UIViewController{
let serverUDP = ServerUDP()
var ToolbarAppeare = false
@IBAction func InfoButton(_ sender: UIBarButtonItem) {
self.performSegue(withIdentifier: "Information", sender:sender)
}
@IBAction func TouchTap(_ sender: UITapGestureRecognizer) {
if sender.state == .ended {
ToolbarAppeare = !ToolbarAppeare
self.navigationController?.setNavigationBarHidden(ToolbarAppeare, animated: true)
}
}
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
override var prefersStatusBarHidden: Bool {
return true
}
override func viewDidLoad() {
super.viewDidLoad()
serverUDP.delegate = self
}
func applicationWillTerminate(application: UIApplication) {
serverUDP.StopServer()
}
func UIColorSet (Red:Float, Green:Float, Blue:Float, Alpha:Float) {
self.view.backgroundColor = UIColor(red: CGFloat(Red), green: CGFloat(Green), blue: CGFloat(Blue), alpha: CGFloat(Alpha))
}
}
【问题讨论】:
-
展示如何创建和使用
FixtureControll的实例。 -
请显示所有相关代码。我找不到任何代码调用您的
artNetReceive(data:)。请遵循 Swift 编码的一个简单规则:只有类型具有大写名称。非类型的大写名称会使您的代码的可读性大大降低。 -
好的,知道了!这是我的其他课程参与了这个应用程序。如您所见,我使用 ViewController 类将 ServerUDP 和 ServerArtNet 类连接在一起。因为只有在 ViewController 类工作委托。如果我能找到在没有 ViewController 的情况下传输数据的方法,我会解决这个问题。
-
我想了解,在类之间传输数据的巧妙方法,我认为 Delegate 是一个很好的工具。但我不完全了解如何使用它。
-
您正在代码中实例化
ServerArtNet,但没有将delegate分配给 实例。因此,永远不会为ServerArtNet实例调用委托方法。