を拾うことができる
extension NSOperationQueue {
public var runningOperations: [NSOperation] {
return operations.filter {$0.executing && !$0.finished && !$0.cancelled}
}
}
あなたは、[NSOperationQueue currentQueue] &の組み合わせを使用することができる実行操作を返す迅速に拡張を思い付いNSThread currentThread]を実行します。
本質的に、currentQueueの操作をループして、currentThreadで実行中の操作を見つける必要があります。
NSOperationは、実行中のスレッドへのアクセスを提供しないため、そのプロパティを自分で追加して割り当てる必要があります。
あなたはおそらく既にNSOperationのサブクラスを作成し、メインを提供するので、そのサブクラスに「スレッド」プロパティを追加している:
@interface MyOperation : NSOperation
@property(nonatomic,strong) NSThread *thread ;
@end
すると、そのプロパティに現在のスレッドを割り当てる
あなたの「メイン」に
+(MyOperation *)currentOperation
{
NSOperationQueue *opQueue = [NSOperationQueue currentQueue] ;
NSThread *currentThread = [NSThread currentThread] ;
for(MyOperation *op in opQueue.operations) {
if([op isExecuting] && [op respondsToSelector:@selector(thread)]) {
if(op.thread == currentThread) {
return (op) ;
}
}
}
}
return nil ;
}
あなたはその後、 'currentOperation' メソッドを追加することができます。これのどれもうまくいきません。オペレーションのisCancelledプロパティを設定することは、オペレーションがisCancelledプロパティを定期的にチェックしない限り無効です。 KVO通知は送信された同じスレッドで受信されるため、確かにKVOは機能しません。 – JeremyP
Errr ...あなたはそれを投票する前に私の投稿を読んだことがありますか?これらのプロパティを観察することは、これらのことがどう行われるかということです。状態の変化を観察した後、-performSelectorOnMainThread ...を使って、メインスレッド上で何かをする必要があります。 「これのどれもうまくいかない」というニュースは、私がいくつかのアプリを持っているので、私にとってはニュースです。また、私はキャンセルを設定*したことはありません。事実、私は具体的にキューが操作をキャンセルし、操作がこの状態を定期的にチェックして、trueの場合は動作を停止すると言いました。 –
何が起こるか:キューはops - > opの投稿をキャンセルするisCancelledのKVOノート、自分自身を停止する - > Observer(あなたの一部のコントローラ)のメモが変更され、もしあれば、メインスレッドでそれを行います。毎回動作します。あなたのコントローラが別のスレッドでメッセージされているからといって、それを処理できないわけではありません。メインスレッドで何かをしなければならない場合は、すぐに進み、メインスレッド上で何かを送信してください。 –