Мы столкнулись с этой точной проблемой в нашем приложении. По сути, вложенные контексты CoreData очень ошибочны в iOS5 и поэтому не работают так, как рекламируется. У этого есть много проявлений, но одним из них является проблема, описанная выше, блокировка запроса на выборку вместо фоновой операции. Это хорошо документировано , поучительная цитата:
NSFetchedResultsДейтрации контроллеров
Вы никогда не хотите, чтобы ваше приложение зашло в тупик. С NSFetchedResultsController и вложенными контекстами это сделать довольно легко. Используя ту же настройку UIManagedDocument, которая описана выше, выполнение запросов на выборку в контексте частной очереди при использовании NSFetchedResultsController с контекстом основной очереди, скорее всего, приведет к взаимоблокировке. Если вы начинаете оба одновременно, это происходит с почти 100% согласованностью. NSFetchedResultsController, вероятно, получает блокировку, которой не должно быть. Это было исправлено в следующем выпуске iOS.
Этот SO-ответ содержит возможное исправление, которое сохраняет вложенные контексты. Я видел других, как это, в основном либерально применяя -performAndWait:
звонки. Мы еще не пробовали это (iOS5 имеет однозначный процент в нашей базе пользователей). Иначе, единственное другое «исправление», которое мы знаем прямо сейчас, - это отказ от вложенных контекстов для iOS5 (см. этот ответ SO ).
То, что CoreData по-прежнему в корне нарушает многопоточность (в iOS 5), непростительно со стороны Apple. Вы можете сделать хороший пример сейчас, когда доверие Apple к CoreData (многопоточность, iCloud), кажется, открывает мешок с болью.