在Swift中编写异步委托方法

时间:2014-09-28 00:53:04

标签: ios asynchronous swift callback serial-port

我有一个通过BLE UART连接与设备通信的应用程序。 收到数据时,会调用didReceiveData()委托。 在这里,我需要确定谁调用数据并触发相应的方法(另一个委托)。 我计划创建一个连接字典,该字典由建立连接时创建的connectionID字符串以及回调的选择器(可能不总是提供)创建。

class Connection: NSObject {
    var selectr: Selector
    var dataString: String?
    init(selectR:Selector,dString:String) {
        selectr = selectR
        dataString = dString
    }
}
connections[String:Connection]()
func sendData(dataString:String,callbackSelector:Selector){
  con = Connection(selectR: callbackSelector, dString:"")
  connections[cid] = con
}

... 致电:

    let sel = Selector(anotherDelegate?.didReceiveLocation(""))
    self.sendData("sendMe",Selector(anotherDelegate?.didReceiveLocation))

我做了一些错误,首先是Type NSData不符合协议StringLiteralConvertible。 NSData引用didReceiveLocation的参数。 第二个是在self.sendData行:无法调用' init'使用类型的参数列表(StringLiteralConvertible,Selector)。

这种方法有意义吗?如何将另一个委托的回调方法存储在字典或其他结构中,以使其可以从didReceiveData委托方法访问?

1 个答案:

答案 0 :(得分:2)

选择器是如此Objective-C ...为什么不只是使用闭包?

使用String作为键和函数声明一个字典,该字符串将String作为参数并且不返回任何内容:

connections = [String:String->()]()

要声明一个带有单个String参数且没有返回值的闭包的函数,请使用以下内容:

func sendData(dataString:String, callback:String->()) {
    ...
    connections[cid] = callback
    ...
}

要稍后调用该闭包,可以将其作为子例程调用(在这种情况下执行字典查找后,使用可选链接,以防它尚未分配):

func didReceiveData(...) {
    ...
    connections[cid]?(response)
}

然后调用上面声明的sendData例程,并使用几个缩写语法之一传递一个闭包:

    self.sendData("sendMe") { response in
        ...
    }

请注意,这实际上是简写:

    self.sendData("sendMe", callback:{ response:String in
        ...
    })

请注意,Objective-C调用程序也可以使用此机制,因为闭包或多或少地直接映射到Objective-C块。

有关闭包,定义和调用的更多信息,我强烈建议从iTunes书店下载免费的Swift书。