Моя программа часто заходит в тупик, я не знаю почему, если я использовал coredata

#ios #iphone #objective-c #core-data

#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:amp;error] copy];
return FetchResults;
}
  

Комментарии:

1. Есть код для более подробной информации?

2. Я задал вопрос коду Спасибо за ваш

3. Плохой дизайн: [(AppDelegate *)[[UIApplication sharedApplication] делегат] managedObjectContext]; Покажите другой метод, который выполняется одновременно, и, пожалуйста, покажите код, который вызывает эти методы.

4. Проблема с тупиком связана с потоковой обработкой. Вам нужно предоставить информацию о коде, связанную с потоком. Вы используете этот метод в двух разных потоках одновременно?

5. Я вижу, большое вам спасибо, очень, этот метод вызывается не тем же потоком

Ответ №1:

Сами управляемые объекты не являются потокобезопасными. Если несколько потоков обращаются к NSManagedObjectContext , это приведет к тупиковой ситуации. Apple рекомендует в разделе «Параллелизм с Core Data» использовать шаблон ограничения потоков для работы с параллелизмом в Core Data . В зависимости от вашего приложения, вы можете попробовать:

  1. Создайте отдельный контекст управляемого объекта для каждого потока и совместно используйте единый координатор постоянного хранилища.
  2. Или создайте отдельный контекст управляемого объекта и постоянный координатор хранилища для каждого потока.

И с несколькими контекстами вы можете передавать объекты между контекстами, передавая их objectIDs и извлекая их в другом контексте.

Возможно, вам понадобится более сложный подход с использованием вложенных контекстов. Вот хорошая статья, которая поможет вам: Многоконтекстные CoreData.