Swift 中蓝牙单例类的视图控制器中的观察者

Posted

技术标签:

【中文标题】Swift 中蓝牙单例类的视图控制器中的观察者【英文标题】:Observers in view controllers from Bluetooth singleton class in Swift 【发布时间】:2020-08-18 10:48:01 【问题描述】:

我创建了一个单例类来与多个视图控制器交互。如何从单例类通知蓝牙状态?

import UIKit
import CoreBluetooth
        
class MyBluetoothManager: CBCentralManagerDelegate, CBPeripheralDelegate
       
        static let shared = MyBluetoothManager()
        
        let central = CBCentralManager(delegate: MyCentralManagerDelegate.shared,
                                       queue: nil, options: nil)
  

我将在未来实现 CBPeripheral 的代表。建议我是否有任何现有的博客。

【问题讨论】:

【参考方案1】:

你可以考虑NotificationCenter

在您的视图控制器中,您需要为您的自定义通知类型添加观察者。例如:

NotificationCenter.default.addObserver( self, selector: #selector( self.methodtohandle ), name: .yourcustomeventname, object: nil )

当不再需要/呈现控制器时,不要忘记移除观察者:

NotificationCenter.default.removeObserver(self, name: .yourcustomeventname, object: nil)

在你的单身课程上,你会称之为“post”:

NotificationCenter.default.post(name: .yourcustomeventname, object: somedata)

【讨论】:

我做到了@DimaG。我正在寻找更相关的答案。我不认为这是获得代表通知的唯一方法。顺便说一句,谢谢,因为我可以知道如何删除目标观察者。 这当然取决于你。根据您的代码,我假设您的“MyBluetoothManager”将实现委托协议,然后您需要将数据传递给视图控制器。对于这种情况,NotificationCenter 非常棒,因为它使 ViewControllers 和您的单例保持松散耦合。有一种方法可以通过回调来做到这一点,但是这样你就有可能导致内存泄漏。 谢谢。目前,我正在使用您的解决方案。它确实有效。

以上是关于Swift 中蓝牙单例类的视图控制器中的观察者的主要内容,如果未能解决你的问题,请参考以下文章

单例模式总结

Alamofire 单例 webservercall 类错误

boost库之单例类

应用程序午餐时初始化单例类

C++ 难以在单例类中创建类的实例

如何快速创建单例类? [复制]