У меня три задания:
Задача извлечения. Он извлекает объекты (около 2000 из них) из CoreData
и передает NSManagedObjectIDs
в основной поток, где они преобразуются обратно в NSManagedObjects
и сохраняются в NSArray
. Эта задача имеет наименьший приоритет.
Вычислительная задача. Эта задача перебирает эти объекты и вычисляет некоторые значения для объекта. Значения хранятся как временные атрибуты подкласса NSManagedObject
. Эта задача имеет 2-й наивысший приоритет.
Задача рисования OpenGL ES. Это цикл рисования, который обновляет пользовательский интерфейс на основе результата вычислительной задачи. Эта задача имеет наивысший приоритет, так как любое замедление уменьшит частоту кадров и будет очень заметным при масштабировании или панорамировании.
Моя проблема заключалась в создании шаблона проектирования, который позволяет первым двум задачам выполнять свою работу, в то же время позволяя задаче OpenGL работать с максимальной частотой кадров. Что неизбежно произойдет, если я использую очереди GCD, так это то, что задача OpenGL будет заблокирована одной из двух других, и она будет заикаться.
Я думаю, что мне нужно, чтобы поток OpenGL работал с собственной копией данных, но я не уверен, как это выглядит, или даже если это правильное решение. Кто-нибудь имел дело с этим типом проблемы раньше? Если да, то как вы достигли одновременности и производительности?