NSOperationQueue, асинхронная задача и maxConcurrentOperationCount - PullRequest
0 голосов
/ 29 января 2019

Я пишу некоторый сетевой многопоточный код.У меня уже есть пример работы с dispatch_group.Но я наткнулся на NSOperationQueue и хотел попробовать.

На высоком уровне мой псевдокод выглядит следующим образом:

  1. Я инициализирую NSOperationQueue и устанавливаю maxConcurrentOperationCount как некоторое конечное число (5)
  2. Я связываю параллельную очередь сэто NSOperationQueue.
  3. Затем я начинаю добавлять NSOperationBlocks в эту очередь.Этот синтаксис выглядит следующим образом:
{ 
    for (NSURL url in allUrls) {
        NSBlockOperation *jtOperation = [NSBlockOperation blockOperationWithBlock:^{
           [kick network download for url which is blocking in nature]) 
        }];
        [operationBlockQueue addOperation:jtOperation];
    }

//wait here till all urls are downloaded.
//Keep printing [operationQueue operationCount] after every 30 seconds 

//and url download code looks like: 
1. Initialize NSURLSession. 
2. Add NSDataTask to it. 
3. Wait till callbacks return. (success or error) (using blocking dispatch_semaphore)
4. After success/failure return.   
}

Я надеялся, что число создаваемых потоков будет только 5. Но я вижу количество одновременных потоков как 200. Я подозреваю, что это все кипитвплоть до синхронных / асинхронных блоков.Но я все еще в замешательстве, так как мой блок кода блокируется.

Я также попробовал одно простое упражнение:

    int var = 2;
    dispatch_queue_t browseQueue = dispatch_queue_create("com.myqueue.msdbrowse", DISPATCH_QUEUE_CONCURRENT);
    NSOperationQueue *myOpQueue = [[NSOperationQueue alloc]init];
    [myOpQueue setMaxConcurrentOperationCount:5];
    [myOpQueue setUnderlyingQueue:browseQueue];
    for (i=0; i<25; i++) {
        [myOpQueue addOperationWithBlock:^{
            NSLog(@"value of i is %d",i);
            while (var != 3) {

            }
        }];
    }

     while(1) {
         NSLog(@"total concurrent queues are:%d",[myOpQueue operationCount]);
         sleep(5);
     }
and here output was total concurrent queues are 25. 
...