запуск нескольких фоновых потоков подряд на iphone / ipad - PullRequest
0 голосов
/ 14 сентября 2010

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

Итак, мне нужно запустить несколько фоновых потоков подряд, чтобы я мог пакетно загрузить изображения в группах, скажем, 200, чтобы мои пулы автоматического выпуска могли очиститься и освободить память.

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

Кто-нибудь раньше решал подобные проблемы?

Ответы [ 3 ]

1 голос
/ 14 сентября 2010

NSOperationQueues решит эту проблему для вас. Вы создаете класс, который происходит от NSOperation, который выполняет загрузку для вас. Затем вы создаете NSOperationQueue и добавляете загрузки в очередь. Вы можете контролировать максимальный параллелизм очереди и т. Д.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/index.html

0 голосов
/ 26 мая 2011

Использовать NSInvocationOperation.Это поможет исправить проблему, а не разбивать код на части.вот образец, который я использовал

NSOperationQueue *downloadQueue = [NSOperationQueue new]; for (Product *cProduct in productsMasterArray) {
NSInvocationOperation *downloadOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImages:) object:cProduct.ITEM_CODE]; [downloadQueue addOperation:downloadOperation]; [downloadOperation release]; }
0 голосов
/ 14 сентября 2010

Вам не нужно ждать, пока все загрузится, прежде чем освобождать память.Вы можете просто передать каждое изображение или небольшую партию изображений в основной поток, используя executeSelectorOnMainThread, и позволить основному потоку освободить память, поскольку он кэширует данные в хранилище или использует данные.Затем продолжите в фоновом потоке до завершения и передайте сообщение "выполнено", снова используя executeSelectorOnMainThread.

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