Déconnecter un BLE périphérique en SWIFT

J'ai quelques problèmes pour déconnecter un BLE périphérique en Swift. Tout d'abord, j'ai essayé d'utiliser uniquement le cancelPeripheralConnection: fonction. Mais si je viens d'appeler cette fonction, le didDisconnectPeripheral fonction n'est jamais appelée. J'ai donc essayé de suivre Apple guide de référence. Il y a-dire, que vous devez supprimer toutes les notifications avant de le débrancher. Est-ce vraiment nécessaire? Et est-il possible d'annuler toutes les notifications en une seule étape? - Je configurer un grand nombre de notifications, j'ai donc à la recherche dans de nombreux services et caractéristiques à les rétablir. Je suppose, qui ne peut pas être un "bien fait" solution.

EDIT:
Ok j'ai compris, que le cancelPeripheralConnection fonctionne assez bien, si je l'appelle dans mon BluetoothManager classe, où CBCentralManager et CBPeripheralDelegate sont inclus... Est-il un moyen de déconnexion d'un périphérique à l'extérieur de cette fonction?

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...
}

Et c'est ma mise en œuvre de la disconnectPeripheral fonction (intégré dans la BluetoothManager classe):

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

Mais de toute façon, si j'appelle cette fonction, le didDisconnectPeripheral fonction n'est pas appelée. Quand je mets la fonction dans le BluetoothManager catégorie par exemple, après que j'ai découvert la dernière caractéristique, tout fonctionne.

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

}
Comment êtes-vous essayer d'appeler cancelPeripheralConnection? Vous devez appeler dans le cas de la CBCentralManager qui a la connexion
J'ai ajouté mes deux classes différentes. Le BluetoothManager classe contient les fonctions déléguées et les ValueCollectionView classe doit débrancher le c? BLE de connexion lorsque vous appuyez sur le bouton retour.
Avoir les fonctions Bluetooth en vue contrôleur n'est pas une conception très bonne parce que vous êtes en mélangeant les deux fonctions et la nécessité de conserver une référence à une vue contrôleur peut ne pas être nécessaire. Il serait préférable de déplacer l'ensemble de vos fonctions Bluetooth dans un Bluetooth objet et passer une référence à l'objet en cas de besoin
J'ai essayé de la mettre en œuvre comme vous l'avez dit, mais le didDisconnectPeripheral fonction n'est pas appelée de toute façon.
Vous devez vous assurer que vous êtes seulement de l'instanciation d'une seule instance de Bluetooth de la classe (et donc CBCentral).

OriginalL'auteur Passe | 2015-10-21