Avant de lancer le mien File d'attente en utilisant NSMutableArray
, je voudrais savoir s'il y a quelque chose de plus standard disponible. Je ne vois rien dans les documents Apple, mais je serais surpris s'il n'y a pas une implémentation de la file d'attente de quelque part que les gens utilisent. Java me gâte!Existe-t-il une structure de données Queue/FIFO pour l'iPhone?
Répondre
L'implémentation d'une file d'attente basée sur NSMutableArray
est assez facile, c'est probablement moins de 50 lignes de code.
EDIT:
trouvé cela avec une recherche rapide 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
cacao lui-même n'a pas de classe de file d'attente, et il n'y a pas une norme en soi, mais il y a plusieurs options, un de qui peut le mieux répondre à vos besoins. Voir this question (et my answer).
Comme vous l'avez dit, vous pouvez rouler le vôtre en utilisant NSMutableArray. Si vous avez juste besoin d'une file d'attente rapide (et ne vous inquiétez pas de la copie, de l'encodage/décodage, de l'énumération, etc.) alors la solution suggérée par @Matt est une approche facile. Vous devriez également considérer adding queue methods to NSMutableArray
via a category, ce qui est bien dans le sens où votre "queue" est également un tableau (vous pouvez donc le passer pour les paramètres NSArray), et vous obtenez toute la fonctionnalité NS (Mutable) Array gratuitement.
Si la performance est importante, je recommande d'utiliser une structure plus idéale pour enlever le premier élément. J'ai écrit CHCircularBufferQueue pour mon propre cadre pour cette raison même. (Je n'essaie pas de taper mon propre cor, essayant simplement de sauver les autres.)
J'ai créé une catégorie contenant uniquement la méthode deque, basée sur le code 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
Vous pouvez utiliser la file d'attente STL à partir de la bibliothèque standard C++.
Consultez le STL priority queue. Il nécessite zéro lignes de code et c'est portable! Que pourrais-tu vouloir de plus?
sécurité des threads;) – Michael
Vous pouvez utiliser la méthode: lastObject de NSArray. Voici un exemple non testé:
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
- 1. Structure de données utilisée pour la structure de répertoire?
- 2. Structure de données pour les relations
- 3. Meilleure structure de données pour la recherche?
- 4. comment analyser une structure de données arborescente?
- 5. Structure de données d'arbre
- 6. Utiliser les données avec une structure variable
- 7. Problème pour définir une structure
- 8. Où puis-je trouver un module Perl pour convertir une structure de données Perl en une structure JavaScript?
- 9. Structure de répertoire pour une bibliothèque C++
- 10. Sémantique de la structure html pour les pages de données
- 11. Gérer une grande structure de données en Java
- 12. Structure de données pour stocker des matrices creuses
- 13. structure de données utilisée pour implémenter l'option UNDO et REDO
- 14. structure de la base de données
- 15. Actionscript « objet » étiqueté comme une véritable structure de données pour une meilleure lisibilité
- 16. Structure de données pour stocker des événements récurrents?
- 17. Structure de données similaire à une carte à 2 arguments
- 18. sélection de la structure de données
- 19. Structure de données pour stocker des milliards d'entiers
- 20. Comment analyser une structure de données sérialisée PHP en Java?
- 21. Boost.Lambda: Insérer dans une structure de données différente
- 22. structure du modèle de base de données
- 23. Structure des données du calendrier
- 24. 2d Structure de données en C#
- 25. Données de planification des tâches/structure d'objet
- 26. Structure de données espace-efficace pour stocker une liste de mots?
- 27. iPhone: choix de la structure de données
- 28. Construire une structure arborescente
- 29. Quel type de structure de données OO dois-je utiliser pour ces données de chaîne?
- 30. Structure de la base de données pour les données de base remplacées sélectivement par client
+1 Je nettoyais le formatage du code un peu, et la méthode -takeObject. –
ajouter un [release d'objets] sur votre dealloc un je vais vous donner un +1 – slf
Une meilleure implémentation serait une liste chaînée. Avec une liste chaînée, vous pouvez optimiser le temps passé à effectuer chaque opération sur O (1). Avec NSMutableArray, vous avez une opération O (n) pour chaque takeObject (removeObjectAtIndex décale tous les éléments). – George