Высокая активность ЦП с `dataWithData` + неблокирующий поток

Я пытаюсь исправить проблему, которую я вижу на своем iDevice, но не на своем Mac (очевидно).

Я отметил очень высокую активность процессора в этой строке:

data = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)];

Это появляется, когда я загружаю и показываю HD-картинку (4-5 мес).

Что-то не так в моем коде или я делаю что-то очень плохое?

edit Наконец, эта строка не так важна. Моя проблема заключалась в том, что я думал, что мой асинхронный метод находится в другом потоке. Это не так.

Я начинаю думать о новом потоке с:

[NSThread detachNewThreadSelector:@selector(test:) toTarget:self withObject:myObject];

Для моей проблемы это лучший способ сделать это?

Спасибо за помощь.


person brcebn    schedule 15.06.2014    source источник


Ответы (2)


В основном, когда это возможно, операции с интенсивным использованием ЦП должны выполняться в фоновом потоке, чтобы избежать блокировки любого взаимодействия с пользователем в вашем приложении. Надеюсь, ты позаботишься об этом.

Кроме того, ваш процесс, связанный с созданием/манипулированием изображениями, будет иметь тенденцию к интенсивному использованию ЦП.

person Vijay Tholpadi    schedule 15.06.2014
comment
Очевидно, все в фоновом режиме, но я боюсь времени, которое занимает эта операция. Я не знаю средней продолжительности этой операции. У вас есть какая-нибудь ссылка на это? Может быть, существует математическая функция для расчета продолжительности лечения в зависимости от размера/разрешения изображения? Если я могу предсказать продолжительность, я могу изменить размер изображения, если это необходимо. - person brcebn; 15.06.2014
comment
Вы слишком много думаете об этом. Сжатие JPEG сильно загружает ЦП. Если вы используете GCD для выполнения работы в фоновом режиме, он не будет блокировать пользовательский интерфейс. Просто позвольте ему работать. - person Duncan C; 15.06.2014
comment
Я нашел часть своей проблемы. Я думал, что асинхронная загрузка была в другом потоке, но, наконец, нет. Я пытался сделать это с NSThread detachNewThreadSelector:toTarget:withObject:, но не могу остановиться. Это означает, что у меня возникает новая утечка каждый раз, когда я вызываю свой метод. - person brcebn; 16.06.2014
comment
Вам действительно стоит взглянуть на Grand Central Dispatch. - person gnasher729; 17.06.2014

Существует решение здесь, очень хорошо объясняющее проблему неблокирующего потока с использованием NSManagedObjectContext с дочерними элементами.

Другая проблема (высокая активность ЦП) связана с этой проблемой неблокирующего потока.

person brcebn    schedule 20.06.2014