NSObject类中的委托 [英] Delegation in NSObject Classes
本文介绍了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) {
}
}
问题:
- 是否可以实现两个类之间的委派?
- 此方法是否正确?如果不是,什么是正确的方法?
谢谢。
推荐答案
将第一类的实例传递给第二类。
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屋!
查看全文