我发现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)
{
}
}
按顺序取出
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
maxConcurrentOperationCount=1
ne peut garantir qu'un seuloperation
est exécuté à la fois, mais il ne garantit pas que tous lesoperation
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 à chaqueoperation
ajouté.Quelque chose comme ça :
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 termineroperation
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.