BLE + CoreData导致冻结(semaphore_wait_trap)

时间:2015-03-06 09:48:16

标签: ios multithreading core-data core-bluetooth

我正在开发一个应用程序,它将通过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]);
}];

enter image description here

我的问题

发生了什么事,我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的问题是,您的SessionManager单例初始化时遇到竞争条件 - 您的SessionManager初始化调用openWithCompletionHandler异步完成,因此init返回之前对象实际上是 初始化。

我建议您从SessionManager实施委托,以便在初始化完成后回拨。