gpt4 book ai didi

objective-c - Snow Leopard 上的 NSOperationQueue 有多轻量级?

转载 作者:太空狗 更新时间:2023-10-30 03:42:09 28 4
gpt4 key购买 nike

我正在处理一些代码,这些代码通过各种回调执行大量异步操作; Snow Leopard 通过 block 和 GCD 使这一切变得异常简单。

我从 NSBlockOperation 中调用 NSTask,如下所示:

[self.queue addOperationWithBlock:^{
NSTask *task = [NSTask new];
NSPipe *newPipe = [NSPipe new];
NSFileHandle *readHandle = [newPipe fileHandleForReading];
NSData *inData = nil;
[task setLaunchPath:path];
[task setArguments:arguments];
[task launch];

while ((inData = [readHandle availableData]) && [inData length]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// callback
}];
}

[task waitUntilExit];
}];

这种方法非常有效。这就像变魔术一样,只要我的回调正确处理并发。

现在,我希望能够合并其中的一些调用;这是在模型对象的“刷新”方法中,可能需要很长时间才能完成。让用户点击刷新按钮不应该占用机器等等。

我可以在这里看到实现困境。我可以制作一大堆队列 - 每个调用类型一个 - 并将它们的并发操作计数设置为 1,然后在需要新调用时调用 -cancelAllOperations

或者,我可以对当前正在发生的调用进行更多的手动簿记,并为每个模型对象管理一个队列(正如我正在做的那样),或者我可以更进一步,使用全局队列。

NSOperationQueue 有多重?创建大量队列是一个糟糕的架构决策吗?有没有更好的方法来合并这些任务?

最佳答案

如果您担心性能,请不要猜测:测量并修复您发现的任何瓶颈。添加队列很简单;尝试一下,看看 Instruments 会告诉您对性能的影响。

创建多个队列的主要原因是为了防止您出于某种原因想要启动和停止它们。如果您只想获得 libdispatch 的好处,只需将操作添加到主队列即可。

关于objective-c - Snow Leopard 上的 NSOperationQueue 有多轻量级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513088/

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