To run database fetching in background thread(in a separate context), so that the UI does not get blocked: __block NSMutableArray *dataArray= [[NSMutableArray alloc] init]; // Create a child context of the main context NSManagedObjectContext *privateContext = [NSManagedObjectContext MR_context]; // When using private contexts execute the core data code in it's private queue using performBlock: or performBlockAndWait: [privateContext performBlock:^{ // Execute fetch NSArray *privateObjects; if(entity_predicate == nil) { //fetch all! duh! privateObjects = [self MR_findAllSortedBy:sort_key ascending:YES inContext:privateContext]; } else { privateObjects = [self MR_findAllSortedBy:sort_key ascending:YES withPredicate:entity_predicate inContext:privateContext]; ...