Не работает делегат протокола


#1

Всем привет! Немного запутался, не могу разобраться, почему не вызывается метод “receiveData” протокола “ServerUDPDelegate”. Причем в классе ViewController всё работает отлично , но вот только в классе ArtNet не получаеться сделать тоже самое, подскажите пожалуйста, где чего забыл?

class ViewController: UIViewController, UITextFieldDelegate {

let serverUDP = ServerUDP()
let artNet = ArtNet()
    
override func viewDidLoad() {
    super.viewDidLoad()
    serverUDP.delegate = self

}

extension ViewController: ServerUDPDelegate {
func receiveData(data: Data, address: String) {
    TextView.text.append("\(data)\n\(address)\n\n")
    TextView.textColor = UIColor.green
   }
}


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 udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext withFilterContex: Any?) {

 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)
}
}



import UIKit

class ArtNet: NSObject {
let serverUDP = ServerUDP()

override init() {
        super.init()
        serverUDP.delegate = self
}
}

extension ArtNet: ServerUDPDelegate {
    func receiveData(data: Data, address: String) {
    print("\(data) did receve from address \(address)\n")
}
}

#3

Мне кажется делегат просто не видит связи с ArtNet. Получается вы хотите сделать из ViewController’a что-то типо посредника.
Почему бы просто не сделать какой-то метод в Artnet, который будет вызваться из ViewController’a при вызове делегата?


#4

Сейчас ViewController получает данные только для отладки. Сейчас цель передать данные в ArtNet для парсинга, а результат уже он отправит во ViewController.

Почему может быть, что делегат не видит ArtNet?


#5

Сложно сказать. Как я сказал, это лишь мое предположение.
Сделайте проще. Создайте метод в ArtNet, который будет работать с этими данными.
Во ViewController’e в методе receiveData, передайте данные в метод ArtNet и все должно работать.


#6
class ArtNet: NSObject {
    let serverUDP = ServerUDP()

    override init() {
             super.init()
             serverUDP.delegate = self
        }
}

Где-то тут у Вас ошибка. Вы же создаете свой собственный экземпляр ServerUDP внутри ArtNet и вот тут у Вас обрывается связь.
Вам же нужно присвоить сюда уже существующий экземпляр, который Вы создаете ранее.


#7

У меня сейчас цель научиться работать с делегатами и протоколами.
Сейчас, то что я уже выяснил, что класс ArtNet и его методы почему-то не видны для других классов. Причем я ради теста в классе ViewController создал сильное свойство класса ArtNet и попытался вызвать его метод, ни чего не получилось. Может, что то не учел когда создавал класс? Хотя класс UDPserver точно так же создавал.