objective-c - NSOperationQueue中如何實作依序單一執行
ringa_lee
ringa_lee 2017-04-27 09:03:07
0
2
461

我發現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

全部回覆(2)
滿天的星座

maxConcurrentOperationCount肯定是管用的,一步接口串行之行,你要在收到回調後發送時間(條件變量,信號等)

Peter_Zhu

maxConcurrentOperationCount=1只能保证一次只有一个operation在执行,但并不能够保证将所有加入的operation严格按序执行。
如果需要让加入的所有operation都严格按序执行的话,最简单的方法就是每次给加入的operation都加dependency。
類似:

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

就你題目中的問題來看,雖然你給的兩個函數最後的回呼都是非同步的,但並不是不能套用operation來實現。

你可以自己來子類化一個NSOperation,執行非同步操作然後在回調裡面把NSOperation,执行异步操作然后在回调里面把operation结束掉。
这样一个异步的调用就转成了一个operation結束掉。

這樣一個非同步的呼叫就轉成了一個🎜,並且也是可以套用上面的添加依賴的方法實現嚴格按序執行的。 🎜
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板