2015-06-14 6 views
0

Мне нужно скачать изображения через потоки фона, но ограничить количество потоков. Максимальный номер потока должен быть 5, и в каждом потоке должна быть только одна последовательная очередь. Для клиент-сервера, использующего ракетную библиотеку сокетов. Главная проблема в том, что мне не нужны NSOperation-плюсы, такие как отмены операций. Ищете простое решение, но может нашел только что-то вроде этого:Ограничение количества потоков

self.limitingSema = dispatch_semaphore_create(kOperationLimit); 
    dispatch_queue_t concurentQueue = dispatch_queue_create("limiting queue", DISPATCH_QUEUE_CONCURRENT); 
    dispatch_async(concurentQueue, ^{ 
     dispatch_semaphore_wait(self.limitingSema, DISPATCH_TIME_FOREVER); 

     /* upload image here */ 

     dispatch_semaphore_signal(self.limitingSema); 
    }); 

Но тогда, как ограничить количество потоков и ждать новых операций запуска, пока они не готовы в очереди?

Хорошо ли контролировать количество очередей?

NSArray *queues = @[dispatch_queue_create("com.YOU.binaryQueue_1", DISPATCH_QUEUE_SERIAL), 
        dispatch_queue_create("com.YOU.binaryQueue_2", DISPATCH_QUEUE_SERIAL), 
        dispatch_queue_create("com.YOU.binaryQueue_3", DISPATCH_QUEUE_SERIAL) 
        ]; 

NSUInteger randQueue = arc4random() % [queues count]; 
dispatch_async([queues objectAtIndex:randQueue], ^{ 
    NSLog(@"Do something"); 
}); 
randQueue = arc4random() % [queues count]; 
dispatch_async([queues objectAtIndex:randQueue], ^{ 
    NSLog(@"Do something else"); 
}); 

ответ

3

У GCD нет возможности ограничить количество одновременных блоков.

Это потенциально может создать один поток, который просто ждет каждой операции, которую вы ставите в очередь. GCD динамически настраивает количество потоков, которые он использует. Если вы запустили другой блок, и GCD не имеет больше доступных потоков, он будет вращать другой поток, если он замечает, что доступны свободные ядра процессора. Поскольку рабочий поток спящий внутри вашего блока, процессор считается бесплатным. Это вызовет много потоков, использующих много памяти - каждый поток получает 512 КБ стека.

Ваш лучший вариант - использовать NSOperationQueue для этого, поскольку вы можете напрямую контролировать, сколько операций будет выполняться параллельно, используя свойство maxConcurrentOperationCount. Это будет проще (меньше кода для написания, тестирования и отладки) и гораздо более эффективного.

Смежные вопросы