Клиент Core Data + сервер / фоновое сохранение / общий вопрос импорта - PullRequest
0 голосов
/ 26 июня 2010

Я работаю над приложением Core Data, в котором есть приложение Mac, выступающее в роли «сервера», и iPhone в качестве клиента.Все идет гладко, за исключением того, что я сталкиваюсь с проблемами производительности.

Когда пользователь касается объекта, сервер должен вернуть некоторые объекты, связанные с этим объектом (ничего слишком тяжелого, обычно 3-4 объекта), и показатьпользовательский интерфейс, чтобы выбрать некоторые параметры.Это должно быть как можно быстрее.Время возврата в оба конца на сервер, сервер, извлекающий данные, форматирующий их, возвращающий клиенту, и клиент, создающий NSManagedObjects из данных (которые не могут быть дополнительно оптимизированы), составляет около 200 мс.Код, относящийся к представлению пользовательского интерфейса (который опять не может быть оптимизирован), требует около 150 мс.На iPod touch 2G под управлением iOS 4.0 одна строка кода, сохраняющая контекст управляемого объекта после импорта объектов, занимает от 150 до 200 мс.

Для меня это крики о том, что я должен быть фоном сохранения контекста управляемого объекта.Однако, насколько я понимаю, это не совсем отвечает моим потребностям.Если я хочу сохранить контекст управляемого объекта в фоновом потоке, то все объекты в нем должны быть созданы в фоновом потоке в отдельном контексте управляемого объекта, поэтому я не вижу никакого увеличения скорости, потому что все равно потребуется 100-200 мсек для сохранения, и я буду видеть еще больше накладных расходов, потому что мне все еще нужно будет сообщить моему основному потоку обновить свои управляемые объекты из сохраненного контекста управляемого объекта, прежде чем мой контроллер представления увидит, что ему нужнообновить себя.

Я упускаю очевидное решение?Есть ли что-то в Core Data, которое я мог бы использовать в этой ситуации, чтобы это помогло?Я не хочу бросать такой общий вопрос, как этот, но я совершенно не знаю, куда идти.

1 Ответ

2 голосов
/ 27 июня 2010

Звучит так, будто вам нужно перенести весь обмен данными с сервером в фоновый поток. Если вы это сделаете, то весь пользовательский интерфейс будет реагировать независимо от того, сколько времени занимает связь с сервером.

Для этого вы вставаете в секунду NSManagedObjectContext в фоновом потоке, подключенном к тому же NSPersistentStoreCoordinator. Затем вы выполняете взаимодействие с сервером в этом фоновом потоке (возможно, имеет смысл использовать NSOperation) и сохраняете изменения.

Ваш основной поток и, следовательно, основной NSManagedObjectContext прослушивает уведомления о сохранении, а когда он получает уведомление, обновляет основной поток и пользовательский интерфейс. Это устранит любую замерзание, которое вы видите, и время обработки в основном не будет иметь значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...