#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
. В зависимости от вашего приложения, вы можете попробовать:
- Создайте отдельный контекст управляемого объекта для каждого потока и совместно используйте единый координатор постоянного хранилища.
- Или создайте отдельный контекст управляемого объекта и постоянный координатор хранилища для каждого потока.
И с несколькими контекстами вы можете передавать объекты между контекстами, передавая их objectIDs
и извлекая их в другом контексте.
Возможно, вам понадобится более сложный подход с использованием вложенных контекстов. Вот хорошая статья, которая поможет вам: Многоконтекстные CoreData.