2009-07-09 11 views

Respuesta

10

La implementación de una cola basada en NSMutableArray es bastante fácil, probablemente esté por debajo de 50 líneas de código.

EDIT:

Encontrado esto con una rápida búsqueda en Google:

@interface Queue:NSObject { 
    NSMutableArray* objects; 
} 
- (void)addObject:(id)object; 
- (id)takeObject; 
@end 

@implementation Queue 

- (id)init { 
    if ((self = [super init])) { 
     objects = [[NSMutableArray alloc] init];  
    } 
    return self; 
} 

- (void)dealloc { 
    [objects release]; 
    [super dealloc]; 
} 

- (void)addObject:(id)object { 
    [objects addObject:object]; 
} 

- (id)takeObject { 
    id object = nil; 
    if ([objects count] > 0) { 
     object = [[[objects objectAtIndex:0] retain] autorelease]; 
     [objects removeObjectAtIndex:0]; 
    } 
    return object; 
} 

@end 
+1

+1 Limpié el código de formato a un poco, y el método -takeObject. –

+0

agregue un [release de objetos] en su dealloc y le daré un +1 – slf

+0

Una mejor implementación sería una lista enlazada. Con una lista enlazada, puede optimizar el tiempo dedicado a realizar cada operación en O (1). Con NSMutableArray tiene una operación O (n) para cada takeObject (removeObjectAtIndex cambiará todos los elementos). – George

5

cacao en sí no tiene una clase de cola, y no hay un sí estándar por, pero hay varias opciones, una de lo que mejor se ajuste a sus necesidades. Ver this question (y my answer).

Como dijo, puede hacer su propio uso de NSMutableArray. Si solo necesita una cola quick'n'dirty (y no está preocupado por copiar, codificar/decodificar, enumerar, etc.), entonces la solución @Matt sugiere que es un enfoque fácil. También debería considerar adding queue methods to NSMutableArray via a category, lo cual es bueno porque su "cola" también es una matriz (para que pueda pasarla a los parámetros de NSArray), y obtiene todas las funcionalidades de la matriz NS (Mutable) de forma gratuita.

Si el rendimiento es importante, recomiendo utilizar una estructura más adecuada para eliminar el primer elemento. Escribí CHCircularBufferQueue para mi propio framework por este mismo motivo. (No estoy intentando tocar mi propio cuerno, solo estoy tratando de salvar a los demás).

1

He creado una categoría que contiene solo el método deque, basado en el código de Matt Bridges.

@interface NSMutableArray (ShiftExtension) 
// returns the first element of self and removes it 
-(id)shift; 
@end 

@implementation NSMutableArray (ShiftExtension) 
-(id)shift { 
    if([self count] < 1) return nil; 
    id obj = [[[self objectAtIndex:0] retain] autorelease]; 
    [self removeObjectAtIndex:0]; 
    return obj; 
} 
@end 
0

Puede usar la cola STL de la biblioteca estándar de C++.

0

Echa un vistazo a STL priority queue. ¡Requiere cero líneas de código y es portátil! ¿Qué más podrías querer?

+0

seguridad de hilo;) – Michael

0

Puede usar el método: lastObject de NSArray. Aquí está un ejemplo no probado:

Queue.h

#import <Foundation/Foundation.h> 

@interface Queue : NSObject 

-(void)enqueue:(id)object; 
-(id)dequeue; 

@end 

Queue.m

#import "Queue.h" 

@interface Queue() 

@property(nonatomic, strong) NSMutableArray *backingArray; 

@end 

@implementation Queue 

-(id)init { 
    self = [super init]; 

    if (self) { 
     self.backingArray = [NSMutableArray array]; 
    } 
    return self; 
} 

-(void)enqueue:(id<NSObject>)object { 
    [self.backingArray addObject:object]; 
} 

-(id)dequeue { 
    id object = [self.backingArray lastObject]; 
    [self.backingArray removeObject:object]; 
    return object; 
} 

@end 
Cuestiones relacionadas