问题描述
我发现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) { }
}
按顺序取出
问题解答
回答1:maxConcurrentOperationCount肯定是管用的,一步接口串行之行,你要在收到回调后发送时间(条件变量,信号等)
回答2:maxConcurrentOperationCount=1只能保证一次只有一个operation在执行,但并不能够保证将所有加入的operation严格按序执行。如果需要让加入的所有operation都严格按序执行的话,最简单的方法就是每次给加入的operation都加dependency。类似这样:
NSOperation *operationToAdd;NSOperation *lastOperation = queue.operations.lastObject;if (lastOperation) { [operationToAdd addDependency:lastOperation];}[queue addOperation:operationToAdd];
就你题目中的问题来看,虽然你给出的两个函数最后的回调都是异步的,但并不是不能套用operation来实现。
你可以自己来子类化一个NSOperation,执行异步操作然后在回调里面把operation结束掉。这样一个异步的调用就转成了一个operation,并且也是可以套用上面的添加依赖的方法实现严格按序执行的。