存储函数以便稍后在Swift 2.0中进行回调

时间:2015-12-03 06:26:59

标签: swift2

我有两个功能,func1func2。当一个人打电话时,应检查插座是否已连接。如果未连接套接字,则应将该函数附加到处理程序数组,并在连接套接字时调用它。

func func1(data: NSData) {
    if(!socket.isConnected()) {
        //  how to do here ↓
        handlers.append(func1) 

        startConnectSocket()
        return;
    }
    socket.writeData(data, withTimeout: 0, tag: 0)
}

func func2(data1:NSData , data2:NSData) {
    if(!socket.isConnected()){
        //  how to do here ↓
        handlers.append(funky) 

        startConnectSocket()
        return;
    }
    socket.writeData(data1 + data2, withTimeout: 0, tag: 0)
}

连接套接字时,调用存储在处理程序中的所有函数。

func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) {
    //  how to do here ↓
    for function in handlers {
        // call function
    }
}

1 个答案:

答案 0 :(得分:1)

您不仅要保存对function的引用,还要保存data参数。 所以你需要将它包装到闭包中:

var handlers: [() -> ()] = []

func func1(data: NSData) {
    if(!socket.isConnected()) {
        handlers.append({ func1(data) }) 

        startConnectSocket()
        return;
    }
    socket.writeData(data, withTimeout: 0, tag: 0)
}

func func2(data1: NSData, data2: NSData) {
    if(!socket.isConnected()){
        handlers.append({ func2(data1, data2) }) 

        startConnectSocket()
        return;
    }
    socket.writeData(data1 + data2, withTimeout: 0, tag: 0)
}

func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) {
    for function in handlers {
        function()
    }
}