NSOperationQueue 添加后台线程操作

NSOperationQueue add background threaded operation

我正在尝试将后台线程操作添加到 NSOperation 队列并希望使其按顺序执行,因此我将 setMaxConcurrentOperationCount 设置为 1 但无法实现 同步进程。

我试过下面的代码,

 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

并希望此操作先完成循环 A,然后完成循环 B。

你不应该使用 dispatch_async。您已经使用操作队列将工作移至后台线程,因此您无需使用 dispatch_async 再次移动。通过使用 dispatch_async 您允许操作完成,然后您有 2 个其他后台线程同时处理。

您似乎对 NSOperationBlock 和 dispatch_async 完全感到困惑。 NSOperationBlock 操作都分派到后台队列。分派时间接近于零,然后 NSOperationBlock 完成,下一个 NSOperationBlock 运行s。哪个调度另一个块。然后都在不同的线程上阻塞 运行,每个都记录东西。您的输出正是预期的结果。

如果你想让一件事发生在另一件事之后,最简单的方法是一个块在它完成之前调用另一个。

我刚才也遇到了类似的问题,但是你的好像不一样,不过你可以用这个class我开发的

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 就会开始。

快乐编码