gpt4 book ai didi

ios - 序列化异步方法

转载 作者:行者123 更新时间:2023-11-29 05:44:15 27 4
gpt4 key购买 nike

我有许多任务需要串行执行,但是该任务在完成模块中包括下一个模块。

有什么好的技术可以一次执行一次这些任务,在当前任务完成其完成任务之后开始下一个任务?

除了具有串行NSOperationQueue的NSOperation子类之外,是否还有其他技术?

最佳答案

标准解决方案:


NSOperationQueue,其中maxConcurrentOperationCount1。您说您不想这样做,但您不说原因。串行队列是最合乎逻辑的解决方案。

例如:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;

[queue addOperationWithBlock:^{
NSLog(@"Starting #1");
sleep(3);
NSLog(@"Finishing #1");
}];

[queue addOperationWithBlock:^{
NSLog(@"Starting #2");
sleep(3);
NSLog(@"Finishing #2");
}];

[queue addOperationWithBlock:^{
NSLog(@"Starting #3");
sleep(3);
NSLog(@"Finishing #3");
}];

如果您不想使用串行 NSOperationQueue,则可以使用标准的并发队列,而只需使每个操作都依赖于前一个即可。您无需使用串行队列即可实现所需的串行行为。

例如:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSOperation *operation;
NSOperation *previousOperation;

operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Starting #1");
sleep(3);
NSLog(@"Finishing #1");
}];
[queue addOperation:operation];

previousOperation = operation;
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Starting #2");
sleep(3);
NSLog(@"Finishing #2");
}];
[operation addDependency:previousOperation];
[queue addOperation:operation];

previousOperation = operation;
operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Starting #3");
sleep(3);
NSLog(@"Finishing #3");
}];
[operation addDependency:previousOperation];
[queue addOperation:operation];

您也可以使用 dispatch_queue_create创建GCD串行队列。除了使用GCD代替 NSOperationQueue之外,它与第一个选项具有相同的作用。

例如:

dispatch_queue_t queue = dispatch_queue_create("com.ConnerDouglass.operationtest", 0);

dispatch_async(queue, ^{
NSLog(@"Starting #1");
sleep(3);
NSLog(@"Finishing #1");
});

dispatch_async(queue, ^{
NSLog(@"Starting #2");
sleep(3);
NSLog(@"Finishing #2");
});

dispatch_async(queue, ^{
NSLog(@"Starting #3");
sleep(3);
NSLog(@"Finishing #3");
});

关于ios - 序列化异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56292537/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com