ioscore-datansmanagedobjectsegmentation-faultcrittercism

App get Crash in the CoreData [NsManagedObjectContext]


App get crash on the MyCrashApp line. This crash randomly occurs on the app. I'm trying to load data from servers and store them in table using CoreData, which will be then presented on UIview.

It Shows SIGSEGV error in Crittercism

0   CoreFoundation       0x00000001825edc20 __CFBasicHashDrain + 192
1   CoreData             0x000000018228b1a0 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2092
2   CoreData             0x0000000182289df4 -[NSManagedObjectContext save:] + 164
3   MyCrashApp           0x0000000100109548 0x0000000100090000 + 496968
4   MyApp                0x0000000100104198 0x0000000100090000 + 475544
5   MyApp                0x00000001000dfdf0 0x0000000100090000 + 327152
6   MyApp                0x00000001000eacbc 0x0000000100090000 + 371900
7   libdispatch.dylib    0x00000001978996e8 _dispatch_call_block_and_release + 20
8   libdispatch.dylib    0x00000001978996a8 _dispatch_client_callout + 12
9   libdispatch.dylib    0x00000001978a7b40 _dispatch_root_queue_drain + 2136
10  libdispatch.dylib    0x00000001978a72dc _dispatch_worker_thread3 + 108
11  libsystem_pthread.dylib   0x0000000197aad470 _pthread_wqthread + 1088
12  libsystem_pthread.dylib   0x0000000197aad020 start_wqthread + 0 

This section of code is possibly crashing

NSError *error;
[[[CoredataHelper sharedInstance] managedObjectContext] save:&error];

I am trying to store the value coming from server

- (void) addArticle:(NSDictionary *) ArticleDict
{
    ArticleData * objArticleData = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([ArticleData class]) inManagedObjectContext:[[CoredataHelper sharedInstance] managedObjectContext]];
    [objArticleData setArticle:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_ARTICLE] != nil && ArticleDict[READ_ARTICLES_ARTICLE] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_ARTICLE]:@""]];
    [objArticleData setArticle_id:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_ID] != nil && ArticleDict[READ_ARTICLES_ID] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_ID]:@""]];
    [objArticleData setArticle_title:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_TITLE] != nil && ArticleDict[READ_ARTICLES_TITLE] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_TITLE]:@""]];
    [objArticleData setArticle_type:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_ARTICLE_TYPE] != nil && ArticleDict[READ_ARTICLES_ARTICLE_TYPE] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_ARTICLE_TYPE]:@""]];
    [objArticleData setArticle_author:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_AUTHOR] != nil && ArticleDict[READ_ARTICLES_AUTHOR] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_AUTHOR]:@""]];
    [objArticleData setArticle_categories:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_CATEGORIES] != nil && ArticleDict[READ_ARTICLES_CATEGORIES] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_CATEGORIES]:@""]];
    [objArticleData setArticle_categoryIds:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_CATEGORY_IDS] != nil && ArticleDict[READ_ARTICLES_CATEGORY_IDS] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_CATEGORY_IDS]:@""]];
    [objArticleData setArticle_countries:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_COUNTRIES] != nil && ArticleDict[READ_ARTICLES_COUNTRIES] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_COUNTRIES]:@""]];
    [objArticleData setArticle_description:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_DESCRIPTION] != nil && ArticleDict[READ_ARTICLES_DESCRIPTION] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_DESCRIPTION]:@""]];
    [objArticleData setArticle_excerpt:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_EXCERPT] != nil && ArticleDict[READ_ARTICLES_EXCERPT] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_EXCERPT]:@""]];
    [objArticleData setArticle_feedmapid:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_FEED_MAP_ID] != nil && ArticleDict[READ_ARTICLES_FEED_MAP_ID] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_FEED_MAP_ID]:@""]];
    [objArticleData setArticle_image:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_IMAGE] != nil && ArticleDict[READ_ARTICLES_IMAGE] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_IMAGE]:@""]];
    [objArticleData setArticle_restImage:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_RESTIMAGE] != nil && ArticleDict[READ_ARTICLES_RESTIMAGE] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_RESTIMAGE]:@""]];
    [objArticleData setArticle_name:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_NAME] != nil && ArticleDict[READ_ARTICLES_NAME] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_NAME]:@""]];
    [objArticleData setArticle_languageId:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_LANGUAGEID] != nil && ArticleDict[READ_ARTICLES_LANGUAGEID] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_LANGUAGEID]:@""]];
    if ((ArticleDict[READ_ARTICLES_NEWS_DATE] != nil && ArticleDict[READ_ARTICLES_NEWS_DATE] != (id)[NSNull null]))
    {
        [objArticleData setArticle_date:[NSString stringWithFormat:@"%@",ArticleDict[READ_ARTICLES_NEWS_DATE]]];
    }
    [objArticleData setArticle_newssecdiff:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_NEWS_SEC_DIFF] != nil && ArticleDict[READ_ARTICLES_NEWS_SEC_DIFF] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_NEWS_SEC_DIFF]:@""]];
    [objArticleData setArticle_news_approved_secdiff:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_NEWS_APPROVED_SEC_DIFF] != nil && ArticleDict[READ_ARTICLES_NEWS_APPROVED_SEC_DIFF] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_NEWS_APPROVED_SEC_DIFF]:@""]];
    [objArticleData setArticle_stateIds:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_STATE_IDS] != nil && ArticleDict[READ_ARTICLES_STATE_IDS] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_STATE_IDS]:@""]];
    [objArticleData setArticle_states:[NSString stringWithFormat:@"%@",(ArticleDict[READ_ARTICLES_STATES] != nil && ArticleDict[READ_ARTICLES_STATES] != (id)[NSNull null])?ArticleDict[READ_ARTICLES_STATES]:@""]];
    NSError *error;
    [[[CoredataHelper sharedInstance] managedObjectContext] save:&error];
}

Any help will be appreciated!


Solution

  • Seems like you are calling addArticle on a background thread (presumably the callback after your web service delivers the data).

    You need to do this in a background context. Modify your addArticle method to also take a context argument you use to insert and save.

    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] 
        initWithConcurrencyType: NSPrivateQueueConcurrencyType];
    context.parentContext = [[CoredataHelper sharedInstance] managedObjectContext];
    [context performBlockAndWait:^{
        [self addArticle: dataDictionary inContext: context]
    }];
    

    After this, you might need to save the main context as well, just make sure you do it on the main thread, e.g. by using GCD.