【发布时间】:2020-08-20 21:06:02
【问题描述】:
我正在尝试从 Swift 访问一个 Objective C 单例,但是我似乎只获得了在单例的 init 函数中创建的初始值。暴露的 flightControllerState 对象在委托函数中更新,我可以看到该值在 Objective C 端正确更新。
我在 SO 和 article 上关注了一些不同的帖子,了解如何从 Swift 调用共享对象。 (我还应该提到这是在 react native 项目中运行,如果这可能会产生任何影响?)
编辑更新了 swift 代码 - 我在 init 方法中添加了错误的行以获取共享实例 - 问题仍然相同
Objective-C 单例
@import DJISDK;
@interface RCTBridgeDJIFlightController : RCTEventEmitter<DJIFlightControllerDelegate> {
DJIFlightControllerState *flightControllerState;
}
@property(nonatomic, readonly) DJIFlightControllerState *flightControllerState;
+ (id)sharedFlightController;
@end
@implementation RCTBridgeDJIFlightController
DJIFlightControllerState *flightControllerState;
@synthesize flightControllerState;
+ (id)sharedFlightController {
static RCTBridgeDJIFlightController *sharedFlightControllerInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedFlightControllerInstance = [[self alloc] init];
});
return sharedFlightControllerInstance;
}
- (id)init {
// I also tried this to make sure the shared instance was returned but no luck
//if (sharedFlightControllerInstance != nil) {
// return sharedFlightControllerInstance;
//}
if (self = [super init]) {
flightControllerState = nil;
}
return self;
}
-(void)flightController:(DJIFlightController *)fc didUpdateState:(DJIFlightControllerState *)state {
flightControllerState = state;
}
@end
Swift 类调用单例并访问值
class VirtualStickController {
var flightControllerSharedInstance: RCTBridgeDJIFlightController
override init() {
self.flightControllerSharedInstance = RCTBridgeDJIFlightController.sharedFlightController()
}
func getFlightControllerState() {
if let state = flightControllerSharedInstance.flightControllerState {
print("FLIGHT CONTROLLER STATE: \(state)") // always null
} else {
print ("NULL")
}
}
【问题讨论】:
-
如果你的类中有一个 init 并在 swift override init 中分配它,那么你的代码中没有使用单例,而是一个普通的实例类型。
标签: ios objective-c swift react-native