2016-11-11 107 views
0

我有一个核心数据结构,其中联系人从服务器解析并与帐户实体相关联。创建崩溃I: 1.以用户A登录并创建联系人 2.登录与用户B和崩溃发生。核心数据NSRangeException多线程块中的崩溃

很明显,有一个空的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

最后之前的所有这种解析发生我见th错误以及当一个单独的服务被调用时: 2016-11-11 12:22:34.660266 AtEventUniversal [2223:781261]提供给CFRunLoopRunSpecific的无效模式'kCFRunLoopCommonModes' - 断开_CFRunLoopError_RunCalledWithInvalidMode进行调试。此消息只会在每次执行时出现一次。

感谢您对这个烂摊子的任何提示。

回答

0

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

screenshot