2

NSOperationQueue を作成し、それに NSOperation を追加しようとしています。後で、キューが実行されているかどうかを確認したくないので、おそらく中止します。これらはすべて、さまざまな関数内から呼び出されることになっています。これを行うための最良のアプローチは何ですか? コード例をいただければ幸いです。ありがとう!

4

2 に答える 2

7

シングルトンによって管理される操作キューを作成します。

まず、シングルトン クラスを作成します。へのアクセスを提供しますNSOperationQueue。シングルトンを呼び出しましょうMyGlobalQueueManager

ivarと呼ばれるものがありますmyGlobalQueue

@property (nonatomic) NSOperationQueue* myGlobalQueue;

.mファイルで、オペレーション キューを設定するMyGlobalQueueManagerかなり標準的なメソッドを作成します。init

- (id)init
{
    self = [super init];
    if (self)
    {
        myGlobalOperationQueue = [[NSOperationQueue alloc] init];
    }
    return self;
}

次に、シングルトンとして自身を提供するメソッド。繰り返しますが、これはかなり標準的なものです:

 + (MyGlobalQueueManager *)sharedInstance
{
    static MyGlobalQueueManager *sharedInstance = nil;
    static dispatch_once_t isDispatched;

    dispatch_once(&isDispatched, ^
                  {
                      sharedInstance = [[MyGlobalQueueManager alloc] init];
                  });

    return sharedInstance;
}

使用したい場所からそのキューにアクセスしましょう。

MyGlobalQueueManager* myGlobalQueueManager = [MyGlobalQueueManager sharedInstance];
NSOperationQueue *myGlobalQueue = myGlobalQueueManager.myGlobalOperationQueue;

その後、必要に応じてそのキューに操作を追加できます。

何かがキューに入っているかどうかを知る方法は?

NSUInteger count = [myGlobalQueue operationCount];

中絶するには?次のようにすべてをキャンセルします。

[myGlobalQueue cancelAllOperations];

もちろん、キャンセルは操作に依存します。カスタムNSOperationクラスを作成している場合は、自分で処理する必要があります。

と はかなり使いやすく、非常に簡単ですNSOperationNSOperationQueue

これらすべてについて読むのに最適なドキュメントは、Concurrency Programming Guide です。具体的には、操作キューを見てください

于 2012-09-07T16:29:56.213 に答える
2

それを行うより簡単な方法は、「グローバルに見える」関数を作成することです。別名、パブリック ヘッダーで宣言します。

extern NSOperationQueue * SharedQueue();

コンパイルの「ユニット」内で定義します@implementation.

NSOperationQueue *SharedOperationQueue()
{
  static NSOperationQueue * _SharedQueue = nil;
  return _SharedQueue ?: ^{ _SharedQueue = NSOperationQueue.new;
                            _SharedQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
                     return _SharedQueue;
  }();
}

ちょっとしたおまけとして.. #define「エイリアス」を付けて..本当に悪用することができます!

#define MY_SOQ SharedOperationQueue()

[MY_SOQ addOperationWithBlock:^{ /* GO CRAZY */ }];
于 2013-03-11T07:06:02.923 に答える