2016-01-04 7 views
1

Я пытаюсь добавить резьбовую фоновую операцию в очередь NSOperation и хочу, чтобы сделать его выполнить в последовательности, поэтому я setMaxConcurrentOperationCount к 1, но не в состоянии достичь синхронных процесса.NSOperationQueue добавить фон резьбовой операцию

Я попытался с ниже код,

NSOperationQueue *queue = [NSOperationQueue new]; 
[queue setMaxConcurrentOperationCount:1]; 


    [queue addOperationWithBlock:^{ 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
      for (uint i=0; i<=9999999; i++) { 
       NSLog(@"Loop A"); 
      } 
     }); 
    }]; 

[queue addOperationWithBlock:^{ 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    for (uint i=0; i<=9999999; i++) { 
     NSLog(@"Loop B"); 
    } 
    }); 
}]; 

, которые будут входить как,

2016-01-04 17:25:41.861 TestOperation[582:111196] Loop B 
2016-01-04 17:25:41.861 TestOperation[582:111194] Loop A 
2016-01-04 17:25:41.864 TestOperation[582:111196] Loop B 
2016-01-04 17:25:41.866 TestOperation[582:111194] Loop A 
2016-01-04 17:25:41.867 TestOperation[582:111196] Loop B 
2016-01-04 17:25:41.867 TestOperation[582:111194] Loop A 
2016-01-04 17:25:41.868 TestOperation[582:111194] Loop A 
2016-01-04 17:25:41.869 TestOperation[582:111194] Loop A 

и хотите эту операцию, чтобы завершить петлю А, а затем цикл B.

ответ

2

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

+0

спасибо большое, как я был глуп. –

1

Вы, кажется, полностью смущены о NSOperationBlock и dispatch_async. Операции NSOperationBlock отправляются в фоновый режим. Отправка приближается к нулевому времени, затем завершается NSOperationBlock и запускается следующий NSOperationBlock. Который отправляет другой блок. Затем оба блока работают на разных потоках, каждый из которых записывается. Ваш результат - именно то, что ожидается.

Если вы хотите, чтобы одна вещь произошла после другой, самым простым способом является то, что один блок вызывает другой непосредственно перед его завершением.

+0

Большое спасибо. –

0

Я был также сталкивается подобной проблемой некоторое время назад, но ваш выглядит иначе, но вы можете использовать этот класс, разработанный мной

https://www.cocoacontrols.com/controls/sktaskmanager

вы можете создавать небольшие задачи и выполнить эту задачу в последовательно или одновременно.

SKTask *aTask1=[SKTask taskWithBlock:^(id result, BlockTaskCompletion completion) { 
     // your async task goes here i.e. image downloading in background 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     for (uint i=0; i<=9999999; i++) { 
      NSLog(@"Loop A"); 
     } 
     // once task is completed call this block 
     completion(nil); //this is important otherwise next task will not be exexute 
}); 
}]; 


SKTask *aTask2=[SKTask taskWithBlock:^(id result, BlockTaskCompletion completion) { 
    // your async task goes here i.e. image downloading in background 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     for (uint i=0; i<=9999999; i++) { 
      NSLog(@"Loop B"); 
     } 
     // once task is completed call this block 
     completion(nil); //this is important otherwise next task will not be exexute 

    }); 
}]; 

Создать Целых задачи вы хотите добавить, что все задачи в одном массиве вызова этот метод с массивом, который содержит все объекты SKTask

[SKTaskManager sequenceOperations:arrTask completion:^{ 
    NSLog(@"all task completed"); 
}]; 

Это будет выполнять задачи последовательно, так как только aTask1 завершена затем, а затем начнет запускать aTask2.

Happy Code