私は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つが間違っています。不明な点がある場合は、質問してください。より適切に説明できるように努めます。