1

次のように、キューに NSOperation を作成しました。

ImageLoadingOperation *operation = [[ImageLoadingOperation alloc] initWithImageURL:url target:self action:@selector(didFinishLoadingImageWithResult:)];
[operationQueue addOperation:operation];
[operation release];

これは正常に動作しますが、操作が完了する前にビューがポップされると、アプリは「EXC_BAD_ACCESS」でクラッシュします

cancelAllOperations を呼び出して操作キューをキャンセルしようとしましたが、既に処理中のため、アプリのクラッシュを防ぐことはできません。ドコは、操作が実行されている場合、操作がキャンセルされたことを検出して適切に応答するのは操作次第であると言っていますが、これをどのように実装するかはよくわかりません。

何か案は?

4

3 に答える 3

1

View が何らかのネットワークを呼び出してからコールバックする場合の一般的な問題です。

私の解決策は、操作を呼び出す前にビューを保持できることです。そして、操作が終了したら、ビューを解放します。

- (void)longTask {
   [self retain];
}

- (void)longTaskDidFinish {
   // do something if you want
   [self release];
}
于 2010-09-03T02:02:25.663 に答える
0

ImageLoadingOperation クラスで「キャンセル」操作をオーバーライドするか、ImageLoadingOperation 自体を KVO オブザーバーとして「キャンセル」プロパティに追加する必要があります。そこに - クラッシュしないように操作をインテリジェントにキャンセルできます。

また、ImageLoadingOperation がバックグラウンドで実行される場合は、ビューへのアクセスを何らかの方法でメイン スレッド (すべての描画が行われる場所) に委ねる方が賢明です。dispatch_sync(dispatch_get_main_queue(), ^{}); を使用できます。または、関連するビューに実際にアクセスするために performSelectorOnMainThread を使用することもできます。

おわかりのように、操作キューを使用することの要点は、依存関係を取り除き、物事を並行して実行できるようにすることですが、操作はビューシステムの変更と同期する必要があり、完全性と堅牢性を考慮して設計する必要があります。

于 2015-10-24T07:32:54.373 に答える