2012-05-15 2 views
2

J'essaie de créer une NSOperationQueue et d'y ajouter une NSOperation. Plus tard, je ne veux pas vérifier si la file d'attente est en cours d'exécution et peut-être annuler. Tout cela est censé être appelé à partir de différentes fonctions. Quelle est la meilleure approche pour le faire? Je serais heureux pour un exemple de code. Merci!Global NSOperationQueue

+1

Il ne répond pas vraiment à votre question mais Grand Central Dispatch offre des files d'attente globales prêtes à l'emploi. – gcamp

+0

Cela pourrait être la réponse que je cherchais. Merci beaucoup! – Linus

+0

J'ai réussi à créer et à ajouter une file d'attente mais je n'arrive pas à comprendre comment annuler une tâche dans la file d'attente. – Linus

Répondre

7

Je créer une file d'attente d'opérations gérée par un singleton.

Commencez par créer votre classe singleton. Il donnera accès au NSOperationQueue. Appelons le singleton MyGlobalQueueManager.

Il aura un ivar appelé myGlobalQueue:

@property (nonatomic) NSOperationQueue* myGlobalQueue; 

Dans le fichier .m de MyGlobalQueueManager, créez une méthode init assez standard qui sera mis en place la file d'attente d'opération:

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

Maintenant, la méthode qui se fournit comme un singleton. Encore une fois, cela est plutôt standard:

+ (MyGlobalQueueManager *)sharedInstance 
{ 
    static MyGlobalQueueManager *sharedInstance = nil; 
    static dispatch_once_t isDispatched; 

    dispatch_once(&isDispatched,^
        { 
         sharedInstance = [[MyGlobalQueueManager alloc] init]; 
        }); 

    return sharedInstance; 
} 

Let accès que la file d'attente d'où vous voulez l'utiliser:

MyGlobalQueueManager* myGlobalQueueManager = [MyGlobalQueueManager sharedInstance]; 
NSOperationQueue *myGlobalQueue = myGlobalQueueManager.myGlobalOperationQueue; 

Vous pouvez ensuite ajouter des opérations à cette file d'attente que vous aimez.

Comment savoir si des choses sont en file d'attente?

NSUInteger count = [myGlobalQueue operationCount]; 

Comment abandonner? Annuler tout comme suit:

[myGlobalQueue cancelAllOperations]; 

L'annulation dépend bien sûr des opérations. Si vous écrivez des classes personnalisées NSOperation, vous devrez gérer cela vous-même. Je trouve NSOperation et NSOperationQueue assez facile à utiliser et assez simple.

Un excellent document à lire pour tout cela est le Guide de programmation d'accès simultané. Plus précisément, jetez un oeil à Operation Queues

+0

Hey @Max MacLeod si j'ai deux uicontrollers et en premier dans la fonction d'appel de viewWillDisappear cancelAllOperations sur la file d'attente de Singleton cela va-t-il faire effet sur NSOpearation que je commence dans la viewdidload de 2nd viewcontroller où le premier pousse le 2nd par le contrôleur de navigation? –

+1

Dans ce cas, je voudrais avoir une file d'attente dans chaque contrôleur de vue. Sinon, cela devient plus compliqué. Jetez un oeil à l'exemple de projet MVCNetworking fourni par Apple. Il montre un gestionnaire de réseau singleton qui gère trois ou quatre files d'attente différentes. –

1

Une manière plus simple de le faire est de rendre une fonction "globalement visible". Alias, déclare dans un en-tête public:

extern NSOperationQueue * SharedQueue(); 

et définir au sein de votre compilation "unité" - mais en dehors @implementation tout.

NSOperationQueue *SharedOperationQueue() 
{ 
    static NSOperationQueue * _SharedQueue = nil; 
    return _SharedQueue ?: ^{ _SharedQueue = NSOperationQueue.new; 
          _SharedQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; 
        return _SharedQueue; 
    }(); 
} 

Comme un petit bonus .. #define avec un "alias" .. et vous pouvez abuser vraiment!

#define MY_SOQ SharedOperationQueue() 

[MY_SOQ addOperationWithBlock:^{ /* GO CRAZY */ }]; 
Questions connexes