2015-12-03 58 views
1

我有两个函数,func1func2。当一个人打电话时,它应该检查套接字是否连接。如果套接字未连接,它应该将该函数附加到处理程序数组并在套接字连接时调用它。将函数存储到Swift 2.0中稍后的回调函数

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 
    } 
} 
+0

另一种方式来考虑这样做,这是使用的NSOperation具有依赖性,从而有效地实现了“承诺”的设计。创建一个连接到套接字的操作,另一个根据第一个操作执行func1,另一个执行func2,这可能取决于func1或者只是套接字操作。对于异步的依赖操作,它通常是一个很好的架构。对于这件事,温特是一个很好的wwdc'15谈话。 – farhadf

回答

1

你不仅要参考保存到functiondata参数。 所以,你需要将其包装成封:

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() 
    } 
} 
+0

var handlers = [() - >()]()这行显示错误 我通过修改为 var handler:[() - >()] = [] 有没有更好的方法? –