18

NSOperationQueue一部の機能が必要なため、コードを通常のGCDからに移動しています。私のコードの多くは、正しく機能するためにdispatch_afterに依存しています。と同様のことをする方法はありNSOperationますか?

これは、に変換する必要がある私のコードの一部ですNSOperation。このコードを使用して変換する例を提供できれば、それは素晴らしいことです。

dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL);
dispatch_time_t mainPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeRun * NSEC_PER_SEC));
dispatch_after(mainPopTime, queue, ^(void){
    if(dFade !=nil){
        double incriment = ([dFade volume] / [self fadeOut])/10; //incriment per .1 seconds.
        [self doDelayFadeOut:incriment with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)];
    }

});
4

6 に答える 6

30

NSOperationQueueタイミングメカニズムはありません。このような遅延を設定して操作を実行する必要がある場合は、遅延と最終コードの作成の両方を処理するために、NSOperationからをスケジュールする必要があります。dispatch_afterNSOperation

NSOperation多かれ少なかれバッチ操作を処理するように設計されています。ユース ケースは GCD とは少し異なり、実際には GCD を備えたプラットフォームで GCD を使用します。

解決しようとしている問題がキャンセル可能なタイマー通知を取得するNSTimerことである場合、キャンセルする必要がある場合は、それを使用して無効にすることをお勧めします。次に、タイマーに応答して、コードを実行するか、ディスパッチ キューまたは NSOperationQueue を使用できます。

于 2013-03-18T15:39:25.950 に答える
2

グローバル キューを使用dispatch_after()し続けてから、オペレーション キューでオペレーションをスケジュールできます。渡されたブロックはdispatch_after()、指定された時間以降は実行されず、その時間以降は単にスケジュールされます。

何かのようなもの:

dispatch_after
(
    mainPopTime,
    dispatch_get_main_queue(),
    ^ {
        [myOperationQueue addOperation:theOperationObject];
    }
);
于 2013-03-18T15:36:43.550 に答える
0

スリープを実行する NSOperation を作成できます: MYDelayOperation。次に、実際の作業操作の依存関係として追加します。

@interface MYDelayOperation : NSOperation
...
- (void)main
{
    [NSThread sleepForTimeInterval:delay]; // delay is passed in constructor
}

使用法:

NSOperation *theOperationObject = ...
MYDelayOperation *delayOp = [[MYDelayOperation alloc] initWithDelay:5];
[theOperationObject addDependency:delayOp];
[myOperationQueue addOperations:@[ delayOp, theOperationObject] waitUntilFinished:NO];
于 2014-04-11T06:55:32.610 に答える
0
[operationQueue performSelector:@selector(addOperation:) 
                     withObject:operation 
                     afterDelay:delay];
于 2016-10-24T12:55:59.640 に答える