Jim*_*uls 6 cocoa objective-c nsoperation osx-snow-leopard
我正在使用一些代码,这些代码使用各种回调执行大量异步操作; 使用积木和GCD,Snow Leopard让这非常容易.
我是这样打来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];
}];
Run Code Online (Sandbox Code Playgroud)
这种方法非常有效.它就像魔术,只要我的回调正确处理并发.
现在,我希望能够合并其中一些电话; 这是模型对象的"刷新"方法,可能需要很长时间才能完成.让用户敲击刷新按钮不应该占用机器和所有这些.
我可以看到这里的实施困境.我可以创建一大堆队列 - 每个呼叫类型一个 - 并将其并发操作计数设置为1,然后-cancelAllOperations在新呼叫时调用.
或者,我可以对当前正在进行的调用进行更多的手动记录,并为每个模型对象管理单个队列(正如我正在做的那样),或者我可以更进一步使用全局队列.
有多重NSOperationQueue?创建大量队列是一个糟糕的架构决策吗?有没有更好的方法来合并这些任务?
如果您担心性能,请不要猜测:测量然后修复您发现的任何瓶颈.添加队列很简单; 尝试一下,看看乐器告诉你有关性能的影响.
创建多个队列的主要原因是,如果您有某些理由想要启动和停止它们.如果您只想获得libdispatch的好处,可以通过向主队列添加操作来实现.