2016-11-11 110 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