我的程序经常是僵局,我不知道为什么,如果我使用coredata

时间:2014-07-03 05:32:58

标签: ios iphone objective-c core-data

当我在使用coredata多个实体的同时请求数据会导致这种现象吗? 我找不到原因,想问一下是否有这个原因

以下方法是我的程序之一,有两种类似的方法,它们可能同时出现死锁的原因是什么?

+ (NSArray*)getChat{
NSManagedObjectContext * managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSError * error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Chat" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"lastMessage" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];

[request setSortDescriptors:sortDescriptors];
NSArray * FetchResults = [[managedObjectContext executeFetchRequest:request error:&error] copy];
return FetchResults;
}

1 个答案:

答案 0 :(得分:0)

托管对象本身不是线程安全的。如果多个线程访问NSManagedObjectContext,这将导致死锁。 Apple推荐" Concurrency with Core Data"使用线程限制模式在Core Data中使用并发性。根据您的应用程序,您可以尝试:

  1. 为每个线程创建一个单独的托管对象上下文,并共享一个持久性存储协调器。
  2. 或者为每个线程创建一个单独的托管对象上下文和持久性存储协调器。
  3. 使用多个上下文,您可以通过传递objectIDs并在其他上下文中获取对象来在上下文之间传递对象。

    使用嵌套上下文可能需要更复杂的方法。这是一篇很好的文章,可以帮助您:Multi-Context CoreData