0

私はNSOperationについて勉強していますが、自分の状況に合わせてNSOperationを実装する正しい方法に疑問があります。

私のアプリでは、バックグラウンドで多くの操作を実行したいと思います。私のアプリはデスクトップソフトウェアからデータをインポートできるため、状況によってはデータベースが非常に大きくなる可能性があります。これにより、データの読み取りと分析に数秒かかる可能性があり、この間UIをフリーズさせたくありません。

私がクラスを持っているとしましょう:

ClassX 
- (void) heavyOp1
- (void) heavyOp2
- (void) heavyOp3

各heavyOpはに関連付けられClassXているため、同じクラスに属していることは理にかなっています。

私の質問と私のオプション:

1)?ClassXのサブクラスである必要がありますNSOperation

操作は1つのタスクを表す必要があることを理解しましたが、私のクラスでは3つの異なるタスクを提供しています。いくつかのカスタムコンストラクターを使用して実行を制御することもできますが、おそらく概念を破っていると思います。

2)使用NSInvocationOperationは正しいですか?キャンセルできません!

私はそのようなことができることを知っています:

ClassX *myClassX = [[ClassX alloc] init];
NSInvocationOperation *myOp = [[NSInvocationOperation alloc] initWithTarget:myClassX selector:@selector(heavyOp1) object:nil];
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
[myQueue myOp];

しかし、私が呼び出すと[myQueue cancelAllOperations];、に存在しないため、ClassX応答しself.isCancelledませんNSInvocationOperation

このようなコードでクラスに認識を強制する[myOp addObserver:myClassX forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil];ことはできますが、やはり概念を破っていると思います。

3)私の?NSOperationから各heavyOpメソッドのサブクラスを作成します。ClassX

それは多くのサブクラスを生成し、それを管理するのが難しいかもしれません、私はそれが正しいかどうかわかりません。

それで、問題を解決する正しい方法は何ですか?誰でもアドバイスをくれますか?たぶん、私が説明したオプションの1つが間違っています。不明な点がある場合は、質問してください。より適切に説明できるように努めます。

4

1 に答える 1

0

NSInvocationOperation私は、操作とキューを既存のコードに後付けするために使用されることを考える傾向があります。ゼロから始めた場合、またはよりきめ細かい制御(おっしゃるようにキャンセルする機能)が必要な場合でも、間違いなくのサブクラスを作成しますNSOperation

あなたの重い操作が何であるかを正確に知らなければ、確実に言うのは難しいですが、私はそれらを3つの別々のクラスとして作成する傾向もあります。各操作をキャンセルすると、実行する必要のあることが異なる場合があるため、別々のクラスでそのキャンセルを実行するコードがあることは明らかです。

于 2012-11-20T11:07:08.527 に答える