0

在我的应用程序中,在执行获取请求应用程序时随机获取冻结。我已经尝试了多个选择,如@synchronized和performblock仍然挂起发生。下面是我的第一个获取请求块。应用程序随机挂起在此提取请求中。在执行获取请求时冻结应用程序

+(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; 

    } 

//我的客户对象范围内声明

+(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; 

} 

请指引我来解决这个问题。我努力了,但我现在还不能解决这个问题。

+1

不要用'get'前缀方法;它被保留用于特殊目的,但这不是。 – bbum

回答

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; 

    } 

用于执行提取请求我已经使用子并管理对象上下文与并发类型作为NSPrivateQueueConcurrencyType。它对我来说工作得很好。现在UI挂起不在那里。

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

您的托管对象上下文将在主队列上完成所有工作。这将阻止主事件循环并导致您的应用程序出现挂起。

将工作移出主队列。请参阅Core Data Concurrency Guide

+0

+1感谢您提供给我的bbum文档,真的很有用。 – Ganapathy