Estoy trabajando con un código que funciona de forma asíncrona con varias devoluciones de llamadas; Snow Leopard ha hecho esto increíblemente fácil con bloques y GCD.¿Qué tan ligero es NSOperationQueue en Snow Leopard?
estoy llamando desde un NSTask
NSBlockOperation
así:
[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];
}];
Este enfoque funciona perfectamente. Es como magia, siempre y cuando mis callbacks manejen la concurrencia correctamente.
Ahora, deseo poder unir algunas de estas llamadas; esto está dentro del método de "actualización" de un objeto modelo y puede llevar mucho tiempo completarlo. Hacer que el usuario golpee el botón de actualización no debe atar la máquina y todo eso.
Veo un dilema de implementación aquí. Puedo hacer un montón de colas, una por tipo de llamada, y establecer sus recuentos de operaciones simultáneas en 1 y luego llamar al -cancelAllOperations
cada vez que es hora de una nueva llamada.
De manera alternativa, podría hacer un poco más de contabilidad manual sobre qué llamadas están ocurriendo actualmente y gestionar una única cola por objeto modelo (como lo estoy haciendo) o podría ir más allá y usar una cola global.
¿Cuánto pesa NSOperationQueue
? ¿Crear muchas colas es una mala decisión de arquitectura? ¿Hay una mejor manera de unir estas tareas?
FYI, estás perdiendo tu NSTask y tu NSPipe. + nuevo es equivalente a + alloc/-init, lo que significa que eres responsable de liberarlos ... lo cual nunca haces (en tu código anterior). (a menos que, por supuesto, esté usando GC) –
Es un programa solo de Snow Leopard. Espero que su nuevo código Snow-Leopard-only sea recogido basura. :-D –