18

NSOperationQueue の addOperationWithBlock を使用しています。ブロック内から、操作をキャンセルする必要があるかどうかを確認するにはどうすればよいですか? または、NSOperation プロパティ/メソッドにアクセスしますか?

[myOperationQueue addOperationWithBlock: ^{

  while ( /* long running loop */ )
  {
      // how to determine here if I need to cancel?
      // for that matter, access any NSOperation properties/methods?

  }

}];

NSBlockOperation を使用するためにこれを行うより良い方法はありますか?

4

2 に答える 2

51

より良い解決策NSBlockOperationは、生のブロックの代わりにそれを使用してキューに追加することです。次のようなことができます。

__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
  while(![operation isCancelled]){
    //Some long operation
  }
}];

[[self queue] addOperation:operation];

これにより、操作をもう少し制御しながらブロックを使用できます...さらにいくつかの優れNSOperationた点もあります(たとえば、完了ブロックを追加する機能など)。

于 2011-11-13T17:13:16.907 に答える
2

ブロック内にある場合、操作をキャンセルする必要があるかどうかを実際に確認することはできません。ブロック内にあり、キャンセルされることになっている場合は、キャンセルされます。ブロック自体は NSOperation インスタンスではないため、NSOperation プロパティにアクセスすることはできません。

コード例:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSOperationQueue *q = [[NSOperationQueue alloc] init];
    [q addOperationWithBlock:^{
        [NSThread sleepForTimeInterval:10];
        NSLog(@"Block 1");
    }];
    [q addOperationWithBlock:^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"Block 2");
    }];
    [q cancelAllOperations];
    [NSThread sleepForTimeInterval:15];

    [pool drain];
    return 0;
}

cancelAllOperations 呼び出しを削除すると、期待どおりにブロックが起動します。

操作のキャンセル状態をより細かく制御し、NSOperationQueue と相互作用する必要がある場合は、NSBlockOperation ではなく NSOperation を使用することをお勧めします。これを実現するために NSOperation をサブクラス化できます。

于 2011-06-07T14:12:26.747 に答える