核心数据NSRangeException多线程块崩溃

时间:2016-11-11 22:01:49

标签: ios objective-c multithreading core-data

我有一个核心数据结构,其中联系人从服务器解析并与帐户实体关联。要创建崩溃我: 1.使用用户A登录并创建联系人 2.使用用户B登录并发生崩溃。

显然有一个空的NSArray导致这次崩溃。

使用performBlock循环遍历服务器数据中的每个联系人时发生崩溃:

    NSManagedObjectContext *mainMOC = self.managedObjectContext;
    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    //NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
    [moc setParentContext:mainMOC];
    [moc setUndoManager:nil];


    BCRAccount *account2 = (BCRAccount*)[moc objectWithID:[self.loggedInAccount objectID]];

    //[moc performBlockAndWait:^{
    [moc performBlock:^{
         //parse each contact

我还在一个引用子管理对象的单独方法中为每个联系人调用了一个获取请求:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:[BCRContact entityName]];
NSManagedObjectContext *managedObjectContext = childmoc;

NSArray *fectchresult = [managedObjectContext executeFetchRequest:fetch error:&error];

我想知道这是一个多对多关系问题。第一次登录时必须有一些剩余的数据导致第二次登录崩溃。

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [__ NSArray0 objectAtIndex:]:索引15超出空NSArray的界限' ***第一次抛出调用堆栈: (0x18be921c0 0x18a8cc55c 0x18bdfd3dc 0x10024c154 0x1920301b4 0x1920303e4 0x19201d98c 0x192035448 0x191dd17e8 0x191cea220 0x18f1aa188 0x18f19ee64 0x18f19ed24 0x18f11b7ec 0x18f142c58 0x18f143678 0x18be3f7dc 0x18be3d40c 0x18be3d89c 0x18bd6c048 0x18d7f2198 0x191d582fc 0x191d53034 0x10008e578 0x18ad505b8) libc ++ abi.dylib:以NSException类型的未捕获异常终止

最后,在所有这些解析发生之前,我还会在调用单独的服务时看到此错误: 2016-11-11 12:22:34.660266 AtEventUniversal [2223:781261]无效模式'kCFRunLoopCommonModes'提供给CFRunLoopRunSpecific - 打破_CFRunLoopError_RunCalledWithInvalidMode进行调试。此消息仅在每次执行时出现一次。

感谢您提供有关这一混乱的任何提示。

1 个答案:

答案 0 :(得分:0)

在您不知道导致崩溃的情况下,您应该使用Exception Breakpoint...Symbolic breakpoint...来捕获异常。

screenshot