特定のas 識別子NSOperationQueue
を追加できるように拡張しました。NSBlockOperation
NSString
識別子の値はNSMutableArray
レジストリとして保持されます。これがレジストリの実装方法です。
-(void)addOperation:(NSOperation *)operation withID:(NSString*)operationID
{
@synchronized(self.queueReference)
{
[self.queueReference addObject:operationID]; // <-- just a mutable array
}
[operation setCompletionBlock:^(){
@synchronized(self.queueReference) {
[self.queueReference removeObject:operationID];
}
}];
[self addOperation:operation];
}
基本的に、特定の操作が終了したときにレジストリをクリーニングする完了ブロックを追加しています。
ただし、これは機能しますが、キューにさらに細分性を追加する必要があります。
私はブロック操作でのみキューを使用し、ブロックの実行中に、実行がNSNotification
どのように行われたかに応じて、リスナーに異なるものを送信する場合があります。
私が達成しようとしていたこと:
NSBlockOperation
発信者が特定の識別子をキューに追加しようとしました。キューにそのような識別子が既にある場合は、ブロックを追加せず、呼び出し元のクラス自体をリスナーとして設定します。
何が欠けている ?識別子を確認するだけでは十分ではありません。NSBlockOperation
すでにディスパッチされているNSNotification
が、完了ブロックがまだ呼び出されていない場合があります。
したがって、呼び出し元クラスはキューに問い合わせます。これは、識別子がレジストリに存在することを示しており、呼び出し元は、既に送信されているために決して到着しない通知をリッスンするように誤って設定されています。
代わりに、シナリオは次のようになります。発信者はキューに問い合わせます。これは、「識別子はレジストリにある」と言っていますが、NSNotification
送信されます。そして、呼び出し元がNSBlockOperation
キューに入れられました。
レジストリのチェックは、次の簡単な方法で行われます。
-(BOOL)hasOperationWithID:(NSString*)operationID
{
@synchronized(self.queueReference)
{
return [self.queueReference containsObject:operationID];
}
}
しかし、この時点では、そのような方法を拡張する方法についてはあまり考えていません。私が取り組んでいるコードは一種の「学術的」なものであり、特定の目的には役立たず、私が実験しようとしているだけです。したがって、私はコード内で非常に柔軟です。しかし、これは私にとってまったく新しいテーマなので、提案された実装のマイナス面についてできるだけ具体的に教えてください.