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

我发现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 は確実に機能します。ワンステップのインターフェイスシリアル化で、コールバックを受信した後に時間 (条件変数、シグナルなど) を送信する必要があります

いいねを押す +0
Peter_Zhu

maxConcurrentOperationCount=1 は、一度に 1 つの operation のみが実行されることのみを保証しますが、追加されたすべての operation が実行されることは保証しません厳密に順序通りに。
追加されたすべての operation を厳密に順序どおりに実行する必要がある場合、最も簡単な方法は、追加された各 operation に依存関係を追加することです。
これと同様: 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 リーリー

あなたの質問に関する限り、あなたが指定した2つの関数の最終コールバックは非同期ですが、operationを使用して実装できないという意味ではありません。 🎜 🎜 NSOperation を自分でサブクラス化し、非同期操作を実行して、コールバックで operation を終了することができます。
このような非同期呼び出しは operation に変換され、依存関係を追加する上記の方法を適用して厳密な逐次実行を実現することもできます。 🎜
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート