NSOperationQueue を作成し、それに NSOperation を追加しようとしています。後で、キューが実行されているかどうかを確認したくないので、おそらく中止します。これらはすべて、さまざまな関数内から呼び出されることになっています。これを行うための最良のアプローチは何ですか? コード例をいただければ幸いです。ありがとう!
2 に答える
シングルトンによって管理される操作キューを作成します。
まず、シングルトン クラスを作成します。へのアクセスを提供します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
クラスを作成している場合は、自分で処理する必要があります。
と はかなり使いやすく、非常に簡単ですNSOperation
。NSOperationQueue
これらすべてについて読むのに最適なドキュメントは、Concurrency Programming Guide です。具体的には、操作キューを見てください
それを行うより簡単な方法は、「グローバルに見える」関数を作成することです。別名、パブリック ヘッダーで宣言します。
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 */ }];