2014-09-28 22 views
0

我有一個通過BLE UART連接與設備通信的應用程序。 當收到數據時,會調用didReceiveData()委託。 在這裏,我需要確定誰調用了數據並觸發相應的方法(另一個委託)。 我打算創建一個連接字典,該連接字典由建立連接時創建的connectionID字符串以及回調選擇器(可能並不總是提供)所鍵入。在Swift中編程異步委託方法

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

我得到了一些錯誤這樣做,第一型的NSData不符合協議StringLiteralConvertible。 NSData引用didReceiveLocation的參數。 第二個是在self.sendData行上:不能用類型參數列表(StringLiteralConvertible,Selector)調用'init'。

這種方法有意義嗎?如何將另一個委託的回調方法存儲在字典或其他結構中,以使其可以從didReceiveData委託方法訪問?

回答

1

選擇器是如此Objective-C ...爲什麼不只是使用閉包?

要聲明一個字典使用string作爲鍵和一個字符串作爲參數的功能和返回任何結果:

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

要聲明一個函數,閉包與一個字符串參數和返回值,使用類似:

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

若要在以後關閉調用,您可以(執行字典查找後,在這種情況下,使用可選的鏈接的情況下,它尚未分配),把它作爲一個子程序:

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

然後調用上述聲明的送出數據程序,並通過使用幾個縮寫語法之一封閉:

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

注意,這實際上是短手:

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

請注意,此機制也可以由Objective-C調用方使用,因爲閉包映射或多或少直接映射到Objective-C塊。

有關閉包,定義和調用的更多信息,我強烈建議從iTunes書店下載免費的Swift書籍。

+0

這聽起來像我在找的東西,但我對閉包很陌生,對實現有點困惑。 sendMe()函數與sendData分開嗎?如果我的回調方法是anotherDelegate?.foundLocation(String),我會調用發送數據,如sendData(「findLocation」,「anotherDelegate?.foundLocation(String)」)? – taylormade201 2014-09-28 13:49:49