2017-08-11 60 views
0

我在Viewcontrollers中使用委托,它们运行良好,但现在我希望在我的两个NSObject类之间进行委派处理。 但要崩溃:fatal error: unexpectedly found nil while unwrapping an Optional value在NSObject类中的委托

下面是我在做什么:

基本设备类

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. 此方法是否正确?如果不是,那么正确的方法是什么?

谢谢。

+0

我不知道,但这个盘,我认为它的工作ü... VAR watchBleDeviceObject:watchBleDevice = watchBleDevice() –

+0

你没有初始化的变量dopiSyncCharacteristicDelegate。你只宣布它。这就是为什么它崩溃。 – jegadeesh

+0

@jegadeesh是的,但如何初始化它和在哪里? –

回答

1

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

一等

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)") 
} 
} 
+0

如何初始化watchBleDevice类中的dopiSyncCharacteristicDelegate?您发布的代码已经存在于我的代码中。 –

+0

对不起,你不需要初始化委托对象。你在哪里得到崩溃? – jegadeesh

+0

同时在第一类中调用委托函数。 dopiStreamCharacteristicDelegate.dopiStreamCharacteristicData(data:data) –

0

用于委托模式的基本概念:

protocol SomeDelegate: class { 
    func doSomethig() 
} 

class FirstClass: NSObject { 
    weak var delegate: SomeDelegate? 

    func callDelegate() { 
     delegate?.doSomethig() 
    } 
} 

class SecondClass: NSObject, SomeDelegate { 
    let firstClass = FirstClass() 

    override init() { 
     super.init() 
     firstClass.delegate = self 
    } 

    func foo() { 
     firstClass.callDelegate() 
    } 

    // Delegate method 
    func doSomethig() { 
     print("SecondClass did something") 
    } 
} 

let bar = SecondClass() 
bar.foo() 

// prints "SecondClass did something" 

碰撞fatal error: unexpectedly found nil while unwrapping an Optional value可以出现在代码的不同位置,因为你总是强制打开可选项 - 你应该使用可选的绑定。

所以回答你的问题: 1.是的,这是可能的 2.崩溃发生在哪一行?

+0

崩溃线\t 同时在第一类中调用委托函数。 dopiStreamCharacteristicDelegate.dopiStreamCharacteristicDat a(data:data) –