NSObject类中的委托 [英] Delegation in NSObject Classes

查看:248
本文介绍了NSObject类中的委托的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Viewcontrollers中使用了委托,它们很好地工作,但是现在我希望在两个NSObject类之间进行委托过程。
但是崩溃:致命错误:展开一个可选值时意外发现nil

I have used delegates in Viewcontrollers and they worked well but now I want the delegation process between my two NSObject classes. But getting crash : fatal error: unexpectedly found nil while unwrapping an Optional value

这是什么我在做:

基本设备类

class basicDevice : NSObject, CBPeripheralDelegate  {
    public static let NOTIFICATION_SERVICES_DISCOVERED = Notification.Name(rawValue: "NOTIFICATION_SERVICES_DISCOVERED")

    private var listOfServices:[String:[String]] = [:]
    private var bleDevice:CBPeripheral?

    func setPheripheral(device:CBPeripheral) {
        bleDevice = device;
        bleDevice!.delegate = self;
    }

    func getPheripheral() -> CBPeripheral? {
        return bleDevice;
    }

    func getListOfServices() -> [String:[String]] {
        return listOfServices
    }

    func onConnected() {
        bleDevice!.delegate = self
        self.bleDevice!.discoverServices(nil)
    }

    func onDisconnection() {
        bleDevice!.delegate = nil
    }

    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        if error != nil { print(" didDiscoverServices:: \(error!)") }
        for service in peripheral.services!
        {
            listOfServices[service.uuid.uuidString] = []
            print("Discovered service: \(service.uuid)")
            peripheral.discoverCharacteristics(nil, for: service )
        }

        OperationQueue.main.addOperation({
            NotificationCenter.default.post(name: basicDevice.NOTIFICATION_SERVICES_DISCOVERED, object: nil)
        })
    }

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        if error != nil { print(" didDiscoverCharacteristicsFor:: \(error!)") }

        for characteristic in service.characteristics as [CBCharacteristic]!{
            listOfServices[service.uuid.uuidString]!.append(characteristic.uuid.uuidString)
        }
    }


    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
        if error != nil { print(" didUpdateValueFor:: \(error!)") }
    }

}

头等舱

protocol DopiSyncCharacteristicDelegate : NSObjectProtocol {
    func dopiSyncCharacteristicData(data : NSData)
}

 //CBPeripheralDevice(Device API)
class watchBleDevice : basicDevice {

    var dopiSyncCharacteristicDelegate : DopiSyncCharacteristicDelegate!

    override init() {
        super.init()
    }

    static func getInstance() -> watchBleDevice {
        if (watchBleDevice.instance == nil) {
            watchBleDevice.instance = watchBleDevice();
        }
        return watchBleDevice.instance!;
    }

    override func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    if error != nil { print(" didUpdateValueFor:: \(error!)") }

    if characteristic.uuid == DipoDopi.dopiStreamCharacteristic.UUID {
        let data:NSData = (characteristic.value as NSData?)!;
        print("dopi stream  data :***********: \(data.hex) : \(data.length) : \(String(describing: data.hexString))")
        dopiStreamCharacteristicDelegate.dopiStreamCharacteristicData(data: data)

    }
    super.peripheral(peripheral, didUpdateValueFor: characteristic, error: error)
}
}

第二类

class BluetoothOperations: DopiStreamCharacteristicDelegate{

    var watchBleDeviceObject : watchBleDevice!

    override init(){
        super.init()
        watchBleDeviceObject = watchBleDevice.getInstance()
        watchBleDeviceObject.dopiCharacteristicDelegate = self
    }

    func dopiStreamCharacteristicData(data: NSData) {

    }
}

问题


  1. 是否可以实现两个类之间的委派?

  2. 此方法是否正确?如果不是,什么是正确的方法?

谢谢。

推荐答案

将第一类的实例传递给第二类。

Pass instance of first class to second class.

第一类

    protocol DopiSyncCharacteristicDelegate : NSObjectProtocol {
        func dopiSyncCharacteristicData(data : NSData)
    }

     //CBPeripheralDevice(Device API)
    class watchBleDevice : basicDevice {

    var dopiSyncCharacteristicDelegate : DopiSyncCharacteristicDelegate!

    override init() {
        super.init()
    }

    static func getInstance() -> watchBleDevice {
        if (watchBleDevice.instance == nil) {
            watchBleDevice.instance = watchBleDevice();
        }
        return watchBleDevice.instance!;
    }

    override func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    if error != nil { print(" didUpdateValueFor:: \(error!)") }

    if characteristic.uuid == DipoDopi.dopiStreamCharacteristic.UUID {
        let data:NSData = (characteristic.value as NSData?)!;
        print("dopi stream  data :***********: \(data.hex) : \(data.length) : \(String(describing: data.hexString))")
      if(dopiStreamCharacteristicDelegate != nil)
      {

     dopiStreamCharacteristicDelegate.dopiStreamCharacteristicData(data: data)
      }
      else
      { print("delegate is not set yet.")
        // Passing watchBleDevice instance to BluetoothOperations class to set delegates
        BluetoothOperations().initialize(deviceInstance: watchBleDevice.getInstance())
     dopiStreamCharacteristicDelegate.dopiStreamCharacteristicData(data: data)
       }

    }
    super.peripheral(peripheral, didUpdateValueFor: characteristic, error: error)
    }
    }

第二类

class BluetoothOperations: NSObject , DipoCharacteristicDelegate, DopiCharacteristicDelegate, DopiSyncCharacteristicDelegate, DopiStreamCharacteristicDelegate{

    var dataToDeviceArray:[UInt8] = []
    var getWatchCollectedData: GetWatchCollectedData!
    var watchBleDeviceObject : watchBleDevice!
    private static var instance:BluetoothOperations? = nil;

    static func getInstance() -> BluetoothOperations {
        if (BluetoothOperations.instance == nil) {
            BluetoothOperations.instance = BluetoothOperations();
        }

        return BluetoothOperations.instance!;
    }
    public func initialize(deviceInstance:watchBleDevice) {
        watchBleDeviceObject = deviceInstance;

        watchBleDeviceObject.dopiSyncCharacteristicDelegate = self
    }

func dopiSyncCharacteristicData(data: NSData) {
    print("dopiSyncCharacteristicData : \(data)")
}
}

这篇关于NSObject类中的委托的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆