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 就会开始。
快乐编码
我正在尝试将后台线程操作添加到 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 就会开始。
快乐编码