【问题标题】:Programming Asynchronous Delegate methods in Swift在 Swift 中编写异步委托方法
【发布时间】:2014-09-28 00:53:03
【问题描述】:

我有一个通过 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 行:无法使用类型为 (StringLiteralConvertible,Selector) 的参数列表调用“init”。

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

【问题讨论】:

    标签: ios asynchronous swift callback serial-port


    【解决方案1】:

    选择器是如此的 Objective-C... 为什么不直接使用闭包呢?

    声明一个以字符串为键的字典和以字符串为参数且不返回任何内容的函数:

    connections = [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 书籍。

    【讨论】:

    • 这听起来像我正在寻找的东西,但我对闭包很陌生,对实现有点困惑。您的 sendMe() 函数是否与 sendData 分开?如果我的回调方法是 anotherDelegate?.foundLocation(String),我调用 sendData("findLocation","anotherDelegate?.foundLocation(String)") 之类的发送数据?
    猜你喜欢
    • 2022-11-08
    • 2010-11-27
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多