5

私は現在GCDを使用しています。NSOperationしかし、それは実際にはより高いレベルのプログラムだと聞いています。ただし、はるかに複雑です。

GCD では、バックグラウンドで何かを行うには、私が作成したこのヘルパー関数を使用するだけです。

+(void)doForeGround:(void (^)())block
{
    dispatch_async(dispatch_get_main_queue(), ^{
        block();
    });
}

+(void)doBackground:(void (^)())block
{

    //DISPATCH_QUEUE_PRIORITY_HIGH
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0), ^{
    //dispatch_async(dispatch_get_global_queue(-2,0), ^{
        block();
    });
}

-(void)doBackGround:(void (^)())block onComletion:(void (^)())onCompletion
{
    [BGHPTools doBackground:^{
        block();
        [BGHPTools doForeGround:^{
            onCompletion();
        }];
    }];
}

でそれを行うのNSOperationは簡単ですか?

何か不足していますか?NSoperation で同じことを行うにはどうすればよいですか?

4

2 に答える 2

6

NSOperationGCD で行っているのと同様のことができます。主な違いは、NSOperation追加機能を提供することです。

例えば:

  • NSOperation方法があり-cancelます。ディスパッチ キューにはキャンセルの概念がありません。キューに入れられたすべてのブロックは完了するまで実行されます。
  • NSOperationQueueにはmaximumConcurrentOperationCountプロパティがあり、(たとえば) 一度に 3 つの操作のみを実行できるようにするために使用できます。ディスパッチ キューにはそのような概念はありません。それらは、一度に 1 つのブロックのみを許可するシリアル、またはlibdispatchCPU 使用率と可用性に基づいて適切と思われる数を許可する同時実行のいずれかです。
  • NSOperationは他の に依存することができNSOperation、その依存関係がすべて実行されるまで特定の操作の実行を遅らせることができます。他の操作は、依存する操作が待機している間、キュー内で「先にジャンプ」できます。ディスパッチ キューは、常に厳密な FIFO 順でキューから取り出されます。(API を使用して依存関係をある程度模倣することはできdispatch_groupますが、それは実際には別の種類の問題を対象としています。)

これらの機能を使用していなければ、GCD は問題なく動作します。GCD を使用すること自体には何の問題もありません。NSOperation がいくつかの追加の優れた機能の便利なラッパーを提供しているだけです。

を使用して上記の例を書き換える方法は次のとおりNSOperationQueueです。

+(void)doForeground:(void (^)())block
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        NSLog(@"I'm running on the main thread!");
        block();
    }];
}

+(void)doBackground:(void (^)())block
{
    // Note; rather than allocating a new NSOperationQueue every time, you could
    // allocate the queue once and just refer to that queue. For simplicity, I'll
    // skip that here.
    [[NSOperationQueue new] addOperationWithBlock:^{
        NSLog(@"I'm running asynchronously on whatever thread NSOperationQueue wants!");
        block();
    }];
}

-(void)doBackground:(void (^)())block onCompletion:(void (^)())onCompletion
{
    [[NSOperationQueue new] addOperationWithBlock:^{
        block();
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            onCompletion();
        }];
    }];
}
于 2012-10-19T03:38:09.190 に答える
4

比較のための操作キューの例:

- (void)viewDidLoad
{
  // ...

  self.queue = [[NSOperationQueue alloc] init];

  // ...
}

- (void)job
{
  // background activities ...
}

- (void)startJob
{
  NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self 
                                                                   selector:@selector(job) 
                                                                     object:nil];
  [self.queue addOperation:op];
}
于 2012-10-19T02:34:40.303 に答える