1

iPhoneアプリのUIImageViewクラスにObjective-Cカテゴリを設定しました。このカテゴリの使命は、メモリ/ディスクキャッシングを使用してURLベースの画像を非同期にロードできるようにすることです。

これで、UIImageView + Cache.mでNSOperationQueueにアクセスできるので、読み込みスレッドを開始できます。NSOperationから派生したオブジェクトを作成し、画像のURLとターゲットのUIImageViewで初期化し、操作が完了したらターゲットで実行するセレクターを作成します。セレクターメソッドでは、新しく読み込んだ画像を設定します(または、見つからない場合は、別のプレースホルダー画像を設定します)。これで完了です。

NSOperationが完了する前にUIImageViewが削除されるまで、これは正常に機能します。たとえば、UIに前/次のセグメント化されたコントロールがあり、これらのUIImageViewが削除されて新しく追加されます(アプリで表示されているより大きな「アイテム」の一部です)ので、タップするのは非常に簡単ですこれらは急速に連続しています。

したがって、すべての画像が読み込まれる前にタップを開始することにした場合は、KABLAM!不幸なスレッドには無効なオブジェクトがあり、それを認識していません。:(

これを軽減するために私が見つけることができる最も近いものは、NSOperationのcancelメソッドとisCancelledメソッドです。ただし、カテゴリ内でキャンセルする操作オブジェクトを追跡することはできません。これは、正しく理解していれば、カテゴリはオブジェクトにIVARを追加できないためです。

多分それはカテゴリーがここで良い考えではないことを意味しますか?(泣き言:「しかし、私はカテゴリーをliiiiike!Waaah!」

アドバイスをいただければ幸いです。

4

3 に答える 3

1

私はおそらくこの状況ではカテゴリーを使用しないでしょう。カテゴリは便利ですが、通常は不要です。本当に正当な理由がある場合にのみ、カテゴリを使用します。あなたは正確に何をカテゴリーに入れていますか?

NSOperationサブクラスにすべてを実装できると思います。これが最良のソリューションです。画像がダウンロードされる前に割り当てが解除されないように画像ビューに保持を設定し、ビューが表示されなくなった場合はダウンロードをキャンセルします。それが不可能な場合は、カテゴリを使用する代わりにUIImageViewをサブクラス化します。

于 2009-07-09T12:35:56.053 に答える
0

これを独自のUIImageViewサブクラスに移動しても害はありません。確かに、あなたはカテゴリーが好きかもしれません-しかし、彼らが仕事をしないのなら、なぜそうするデザインに移行することを躊躇するのですか?

于 2009-07-09T12:31:35.193 に答える
0

NSOperation で UIImageView を保持していますか? そうしないと、NSOperation が完了する前に imageView が解放され、kablooi central につながる可能性があります。保持を実行し、setImage を実行したらリリースを実行する必要があります。

于 2009-07-23T08:31:32.490 に答える