0

In my application, while executing fetch request application get freeze randomly. I have tried with multiple Choice like @synchronized and performblock still hang occur. below is my first fetch request block. Application hang in this fetch request randomly.

+(BXXXX *)getDetailsById:(NSNumber *)Id
    {
        NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
        NSEntityDescription *entityDescription = [NSEntityDescription

                                                  entityForName:@"BXXXX"  inManagedObjectContext:[SDataManager managedObjectContext]];
        [fetch setEntity:entityDescription];
        [fetch setPredicate:[NSPredicate predicateWithFormat:
                             @"(BId = %@)",Id]];


        __block NSArray *bDetails;
        [[SDataManager managedObjectContext] performBlockAndWait:^{
            NSError *error = nil;
            bDetails = [[SDataManager managedObjectContext] executeFetchRequest:fetch error:&error];

        }];

        if([bDetails count] == 1)
            return [bDetails objectAtIndex:0];
        else
            return nil;

    }

//MY Managed object context declaration

+(NSManagedObjectContext *)managedObjectContext
{
    static NSManagedObjectContext *managedObjectContext;
    if(managedObjectContext!=nil){
        return managedObjectContext;
    }
    @try { 
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (coordinator != nil) {
            managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            [managedObjectContext setPersistentStoreCoordinator: coordinator];
        }
    }
    @catch (NSException *exception) {
        NSLog(@"Exception occur %@",exception);
    }
        return managedObjectContext;

}

Please guide me to fix this issue. I tried hard but i cant fix this issue still now.

Ganapathy
  • 4,594
  • 5
  • 23
  • 41
  • 1
    Don't prefix methods with `get`; it is reserved for a special purpose, which this isn't. – bbum Jun 25 '13 at 15:42

2 Answers2

2
        managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

Your managed object context is going to do all work on the main queue. This will block the main event loop and cause your app to appear to hang.

Move the work off the main queue. See the Core Data Concurrency Guide.

bbum
  • 162,346
  • 23
  • 271
  • 359
0
I have fixed this issue by creating two managed object context like this.
// Base
    +(NSManagedObjectContext *)managedObjectContext
    {
        static NSManagedObjectContext *managedObjectContext;
        if(managedObjectContext!=nil){
            return managedObjectContext;
        }
        @try { 
            NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
            if (coordinator != nil) {
                managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
                [managedObjectContext setPersistentStoreCoordinator: coordinator];
            }
        }
        @catch (NSException *exception) {
            NSLog(@"Exception occur %@",exception);
        }
            return managedObjectContext;

    }

//Child

    +(NSManagedObjectContext *)childManagedObjectContext
    {
        static NSManagedObjectContext *managedObjectContext;
        if(managedObjectContext!=nil){
            return managedObjectContext;
        }
        @try {
            NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
            if (coordinator != nil) {
                managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
                [managedObjectContext setPersistentStoreCoordinator: coordinator];
            }
        }
        @catch (NSException *exception) {
            NSLog(@"Exception occur %@",exception);
        }
        return managedObjectContext;

    }

for executing the fetch request i have used child managed object context with Concurrency Type as NSPrivateQueueConcurrencyType. It working fine for me. Now UI hang is not there.

Ganapathy
  • 4,594
  • 5
  • 23
  • 41