2015-10-21 155 views
3

我有一些問題需要在Swift中斷開BLE外設。首先,我試圖只使用cancelPeripheralConnection:函數。但是如果我只是稱這個函數,didDisconnectPeripheral函數永遠不會被調用。所以我試着按照Apple's參考指南。有說的是,你應該在斷開連接之前刪除每個通知。這真的有必要嗎?是否有可能一步取消所有通知?我設置了很多通知,所以我必須搜索許多服務和特性來重置它們。我想,這不可能是一個「做得好」的解決方案。在SWIFT中斷開BLE外設

編輯: 好吧,我想通了,那cancelPeripheralConnection工作得很好,如果我把它在我的BluetoothManager類,其中CBCentralManagerCBPeripheralDelegate包括...有沒有辦法斷開到的周邊之外這個功能?

編輯4:

import UIKit 

class ValueCollectionView: UICollectionViewController 
{ 
    var valueCollectionViewCell: ValueCollectionViewCell = ValueCollectionViewCell() 
    var bluetoothManager: BluetoothManager = BluetoothManager() 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     self.navigationItem.hidesBackButton = true 
     let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "back:") 
     self.navigationItem.leftBarButtonItem = newBackButton; 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
    } 

    func back(sender: UIBarButtonItem) 
    { 
     bluetoothManager.disconnectPeripheral(selectedPeripheralIndex!) 
     self.navigationController?.popViewControllerAnimated(true) 
    } 
//Some Collection View functions... 
} 

這是我實現disconnectPeripheral功能(集成在BluetoothManager類):

func disconnectPeripheral(peripheralIndex: Int) 
{ 
    CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral) 
} 

但無論如何,如果我叫這個功能, didDisconnectPeripheral函數未被調用。當我將該功能放入BluetoothManager類時,例如在我發現最後一個特徵後,一切正常。

編輯5:

class BluetoothManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate 
{ 
    var CBmanager: CBCentralManager = CBCentralManager() 

    override init() 
    { 
     super.init() 
     self.CBmanager = CBCentralManager(delegate: self, queue: nil) 
    } 

    func connectPeripheral(peripheralIndex: Int) 
    { 
     CBmanager.connectPeripheral(peripheralArray![peripheralIndex].peripheral, options: nil) 
    } 

    func disconnectPeripheral(peripheralIndex: Int) 
    { 
     CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral) 
    } 

//The other CentralManager functions... 

} 
+0

你打算如何調用cancelPeripheralConnection?您需要在連接 – Paulw11

+0

的CBCentralManager實例中調用它,我添加了兩個不同的類。 BluetoothManager類包含委託函數,當按下後退按鈕時,ValueCollectionView類應斷開BLE連接。 – Passe

+0

在視圖控制器中使用藍牙功能不是一個很好的設計,因爲您正在混合這兩個功能,並需要保留對可能不需要的視圖控制器的引用。將所有藍牙功能移動到單獨的藍牙對象並在需要時傳遞對該對象的引用將更好。 – Paulw11

回答

3

你的第一個疑問,是的,我們應該從訂閱特性註銷從外圍斷開在Apple Documentation給出的理由之前:

注:cancelPeripheralConnection:方法是非阻塞的,並且任何 CBPeripheral類別命令仍然等待外圍您正在嘗試斷開連接,可能會或可能不會完成執行。由於 其他應用可能仍與外設有連接,因此取消 本地連接並不保證底層物理鏈接 立即斷開連接。但是,從您的應用程序的角度來看, 外設被認爲是斷開的,並且中央管理器對象 調用其代理對象的centralManager:didDisconnectPeripheral:error:方法。

現在,來到你的另一個問題 -

有沒有辦法切斷這個功能的外圍之外?

您需要將它與實例化並開始連接的實例斷開連接。只要你可以在同一個對象上調用取消,它就可以工作。

myCentralManager.cancelPeripheralConnection(peripheral) 

在我的應用程序,我不得不使用BLE功能從衆多不同類別而導致我寫一個單身MyBLEManager,所有的類都來此單爲所有BLE相關的活動。這筆交易的效果很好,並且幫助解決僅限於一個課程的故障排除。你可以試試這個。

+0

好的,但我怎麼能保證,我在這兩種情況下使用相同的實例?因爲我在我的UITableView中調用了var bluetoothManager:BluetoothManager = BluetoothManager(),並且在我的UICollection視圖中調用了一次。那是問題嗎? – Passe

+0

是的 - 這是一個問題。你應該創建單例類。這就像魅力確保只有一個對象一直處理。 – Abhinav