objective-c - NSOperationQueue中如何实现按顺序单个执行
ringa_lee
ringa_lee 2017-04-27 09:03:07
0
2
462

我发现maxConcurrentOperationCount=1并不管用 虽然网上搜到一大堆说添加依赖能解决问题 但现实中有如下api

CMStepCounter ios8苹果计步器

  • (void)queryStepCountStartingFrom:(NSDate *)start

                                to:(NSDate *)end
                           toQueue:(NSOperationQueue *)queue
                       withHandler:(CMStepQueryHandler)handler;
                       
                       

    和CMMotionManager中方法

  • (void)startDeviceMotionUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMDeviceMotionHandler)handler

都是异步回调的

怎么实现如下功能

for(int i = 0; i< 24 ;i ++)
{
[_stepCounter queryStepCountStartingFrom:fromDate

           to:toDate                                                    
           toQueue:_timeQueue
           withHandler:^(NSInteger numberOfSteps, NSError *error)
     {

     }

}

按顺序取出

ringa_lee
ringa_lee

ringa_lee

répondre à tous(2)
滿天的星座

maxConcurrentOperationCount fonctionnera certainement. La sérialisation de l'interface en une étape, vous devez envoyer l'heure (variable de condition, signal, etc.) après avoir reçu le rappel

Peter_Zhu

maxConcurrentOperationCount=1 ne peut garantir qu'un seul operation est exécuté à la fois, mais il ne garantit pas que tous les operation ajoutés seront exécutés dans un ordre strict.
Si vous avez besoin que tous les operation ajoutés soient exécutés dans un ordre strict, le moyen le plus simple est d'ajouter une dépendance à chaque operation ajouté.
Quelque chose comme ça :

NSOperation *operationToAdd;
NSOperation *lastOperation = queue.operations.lastObject;
if (lastOperation) {
    [operationToAdd addDependency:lastOperation];
}
[queue addOperation:operationToAdd];

En ce qui concerne la question de votre question, bien que les rappels finaux des deux fonctions que vous avez données soient asynchrones, cela ne signifie pas qu'elles ne peuvent pas être implémentées à l'aide de operation.

Vous pouvez sous-classer un NSOperation vous-même, effectuer des opérations asynchrones et terminer operation dans le rappel.
Un tel appel asynchrone est converti en operation, et la méthode ci-dessus d'ajout de dépendances peut également être appliquée pour obtenir une exécution séquentielle stricte.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal