我正在开发一个应用程序,它将通过CoreBluetooth(BLE)接收数据并将其与CoreData一起存储。它们单独工作,但不能在一起工作,我认为这与线程有关。
我做什么
我使用单例来处理CoreData交互。单例初始化代码如下。 init-code基本上是斯坦福课程CS193p的复制粘贴。
首次访问单例是CoreBluetooth从蓝牙外设收到某个数据块的时候。请参阅下面的代码。
单例初始化
static SessionManager *sharedInstance;
+ (instancetype)sharedSessionManager
{
NSLog(@"Shared instance requested.");
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
第一次SessionManager访问
-(void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
// First some data processing
...
[[SessionManager sharedSessionManager] addMessageToCurrentSession:message];
}
会发生什么
在-(instancetype) init
内,整个应用程序在下面一行冻结(零CPU,无内存增加)。
当断点到达此点时(即在执行之前),我还添加了线程的图像。
[self.document openWithCompletionHandler:^(BOOL success) {
if (success) [self documentIsReady];
if (!success) NSLog(@"Could not open document %@", [self.documentPath path]);
}];
我的问题
发生了什么事,我做错了什么?
答案 0 :(得分:0)
您的问题是,您的SessionManager
单例初始化时遇到竞争条件 - 您的SessionManager
初始化调用openWithCompletionHandler
异步完成,因此init
返回之前对象实际上是 初始化。
我建议您从SessionManager
实施委托,以便在初始化完成后回拨。