Trennen der Verbindung zu einem BLE-Peripheriegerät in SWIFT
Ich habe einige Fragen zu trennen, die ein BLE-Peripheriegerät in Swift. Zuerst, ich habe versucht, nur die cancelPeripheralConnection:
Funktion. Aber wenn ich nur diese Funktion aufrufen, die didDisconnectPeripheral
Funktion wird nie aufgerufen. Also versuchte ich zu Folgen, Apple reference guide. Es ist zu sagen, dass Sie sollten löschen alle Benachrichtigungen, bevor die Verbindung getrennt wird. Ist das wirklich nötig? Und gibt es eine Möglichkeit zu stornieren, werden alle Meldungen in einem Schritt? Ich habe eine Menge von Meldungen, so dass ich suchen muss, in vielen Leistungen und Eigenschaften, um diese zurückzusetzen. Ich denke, das kann nicht "gut gemacht" - Lösung.
EDIT:
Okay, ich dachte, dass die cancelPeripheralConnection
funktioniert ziemlich gut, wenn ich es nennen-in meinem BluetoothManager
Klasse, wo CBCentralManager
und CBPeripheralDelegate
enthalten sind... gibt es eine Möglichkeit zu trennen, um eine periphere außerhalb dieser Funktion?
EDIT 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...
}
- Und dies ist meine Umsetzung des disconnectPeripheral
- Funktion (integriert im BluetoothManager-Klasse):
func disconnectPeripheral(peripheralIndex: Int)
{
CBmanager.cancelPeripheralConnection(peripheralArray![peripheralIndex].peripheral)
}
Aber trotzdem, wenn ich diese Funktion aufrufen, die didDisconnectPeripheral
Funktion nicht aufgerufen. Wenn ich die Funktion in der BluetoothManager-Klasse z.B., nachdem ich entdeckt das Letzte Merkmal, alles funktioniert.
EDIT 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...
}
Ich habe meine zwei verschiedene Klassen. Der BluetoothManager-Klasse enthält die Delegierten Funktionen und die ValueCollectionView Klasse trennen soll die BLE-Verbindung beim drücken der zurück-Taste.
Nachdem die Bluetooth-Funktionen in einer view-controller ist das nicht ein sehr gutes design, weil Sie mischen die beiden Funktionen und benötigen, um einen Verweis auf einen view-controller, die möglicherweise nicht benötigt werden. Wäre es besser zu verschieben Sie alle Ihre Bluetooth-Funktionen in einen separaten Bluetooth-Objekt, und übergeben Sie eine Referenz auf das Objekt, wo nötig
Ich habe versucht, es zu implementieren, wie Sie sagte, aber die didDisconnectPeripheral Funktion nicht aufgerufen sowieso.
Sie benötigen, um sicherzustellen, dass Sie nur die Instanziierung einer Instanz der Bluetooth Klasse (und daher CBCentral).
InformationsquelleAutor Passe | 2015-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihrer ersten Zweifel, ja wir sollten uns Abmelden aus gezeichneten Eigenschaften, die vor dem trennen von Peripheriegeräten für einen Grund gegeben, in Apple-Dokumentation:
Nun, kommen auf Ihre andere Frage -
Müssen Sie trennen Sie es von der Instanz, die Sie instanziiert und gestartet-Verbindung auf. So lange, wie Sie können, rufen Sie die Stornierung auf das gleiche Objekt, sollte es funktionieren.
In meiner Anwendung, die ich benutzen musste, BLE bietet aus vielen verschiedenen Klassen, die führte mich zu schreiben, ein singleton
MyBLEManager
und alle Klassen kamen zu dieser singleton für alle BLE-Aktivitäten. Dieser deal funktioniert Super und Sie Hilfe bei der Fehlerbehebung beschränkt sich auf eine Klasse nur. Sie können dies ausprobieren.Ja - das ist ein problem. Sollten Sie der singleton-Klasse. Das funktioniert wie Charme stellt sicher, dass nur ein Objekt sich mit der Zeit.
InformationsquelleAutor Abhinav