我正在处理一些对各种回调进行异步操作的代码。 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/

10-12 07:15