我正在处理一些对各种回调进行异步操作的代码。 Snow Leopard使用块和GCD使其变得异常简单。
我从NSTask
调用NSBlockOperation
,如下所示:
[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
有多重?创建大量队列是一个错误的体系结构决策吗?有没有更好的方法来合并这些任务? 最佳答案
如果您担心性能,请不要猜测:测量然后修复发现的任何瓶颈。添加队列很简单;尝试一下,看看有什么乐器可以告诉您有关性能的影响。
创建多个队列的主要原因是,如果您出于某些原因想要启动和停止它们。如果您只想获得libdispatch的好处,则可以通过向主队列中添加操作来获得该 yield 。
关于objective-c - NSOperationQueue在Snow Leopard上的重量是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1513088/