2010-09-14 2 views
0

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

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

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

Кто-нибудь справляется с такой проблемой раньше?

+0

Что-то, что может помочь создать собственный пул авторесурсов в потоке, а затем отпустить, когда вы достигнете определенного предела. Таким образом, вы можете контролировать, сколько обрабатывается. – Kennzo

ответ

0

Перед выпуском памяти вам не нужно ждать все, что нужно загрузить. Вы можете просто передать каждое изображение или небольшую партию изображений в основной поток, используя performSelectorOnMainThread, и позволить основному потоку освобождать память, когда он кэширует данные в памяти или использует данные. Затем продолжайте в фоновом потоке до завершения и передайте сообщение «done», снова используя функцию performSelectorOnMainThread.

+0

как вы передаете аргументы в @selector для перехода к основному потоку? Можете ли вы это сделать? – Slee

+0

Да, вы можете сделать это, используя withObject: –

1

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

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

+0

Я использовал ответ hotpaw2 с большим успехом, но я думаю, что мне нужно переосмыслить его, используя NSOperationQueue – Slee

0

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

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]; } 
Смежные вопросы