2009-08-31 12 views
13

Estoy usando un NSOperationQueue para administrar conexiones HTTP (usando ASI-HTTPRequest). Como tengo varias vistas y la necesidad de tener estas vistas diferentes solicitando conexiones HTTP, ¿debería intentar crear una NSOperationQueue global en el delegado de la aplicación, o debería tener una en cada una de las vistas? No estoy familiarizado con NSOperationQueue.¿Compartir NSOperationQueue en View Viewlers?

Me gustaría saber a) cuál es la mejor práctica yb) si no hay una mejor práctica, cuáles son las compensaciones si las hay.

Intenté poner la cola de operaciones en la clase (como una propiedad) donde manejo las conexiones del servidor pero la tarea nunca se activó. No se pudo resolver pero [operaciones de cola] = 0. Si alguien conoce una solución para esto, supongo que este sería el mejor lugar para ponerlo.

Respuesta

14

He resuelto esto agregando un método de clase en NSOperationQueue que creo que Apple ha omitido; una cola de operación compartida. Añado esto como una categoría en NSOperationQueue como esto:

// NSOperationQueue+SharedQueue.h 
@interface NSOperationQueue (SharedQueue) 
+(NSOperationQueue*)sharedOperationQueue; 
@end 

// NSOperationQueue+SharedQueue.m 
@implementation NSOperationQueue (SharedQueue) 
+(NSOperationQueue*)sharedOperationQueue; 
{ 
    static NSOperationQueue* sharedQueue = nil; 
    if (sharedQueue == nil) { 
    sharedQueue = [[NSOperationQueue alloc] init]; 
    } 
    return sharedQueue; 
} 
@end 

De esta manera no necesito para manejar un montón de colas a menos que realmente necesito. Tengo acceso fácil a una cola compartida de todos mis controladores de vista.

que incluso han añadido una categoría para NSObject para que sea aún más fácil añadir nuevas operaciones en esta cola compartida:

// NSObject+SharedQueue.h 
@interface NSObject (SharedQueue) 
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject; 
@end 

// NSObject+SharedQueue.m 
@implementation NSObject (SharedQueue) 
-(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject; 
{ 
    NSOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self 
                   selector:aSelector 
                    object:anObject]; 
    [[NSOperationQueue sharedOperationQueue] addOperation:operation]; 
    [operation release]; 
} 
@end 
+1

¿Cómo se desasigna de nuevo esta cola? – fabb

0

Si ya tiene un puntero a una clase que maneja conexiones en cada controlador de vista/vista, no hay ninguna razón por la que también necesite tener un puntero a la cola de operaciones.

Supongo que lo que quiere hacer es algo como: a) ver las manos (controlador) url (+ datos) al objeto de manejo del servidor, b) el servidor maneja objetos y lo pone en una cola que solo tiene un puntero a.

Es difícil averiguar por qué eso no funcionó si no proporciona más detalles.

Recomiendo encarecidamente taking a look at ASIHTTPRequest que proporciona una clase NetworkQueue para manejar este tipo de tarea. Tiene varios campos delegados convenientes que le permiten registrarse para realizar un seguimiento del progreso, saber cuándo finalizó una descarga o una carga, etc.

3

Mi preferencia personal para esto es tener un producto único que gestiona todas las peticiones HTTP. Cada vista pedirá al singleton que haga la llamada http, pasándose como delegado para esa llamada, luego las manos singleton que delegan y cancelan a una operación NSO y luego NSOperation llama una vez que se realiza la llamada.

+0

Hago lo mismo, excepto 1) No uso un singleton, utilizo un DataController que cuelga del delegado de la aplicación y 2) Utilizo las notificaciones en lugar de la delegación. Con múltiples controladores de vista y solicitudes/operaciones, la lógica de delegación puede ponerse bastante peluda. – kubi

Cuestiones relacionadas