iPhoneアプリのUIImageViewクラスにObjective-Cカテゴリを設定しました。このカテゴリの使命は、メモリ/ディスクキャッシングを使用してURLベースの画像を非同期にロードできるようにすることです。
これで、UIImageView + Cache.mでNSOperationQueueにアクセスできるので、読み込みスレッドを開始できます。NSOperationから派生したオブジェクトを作成し、画像のURLとターゲットのUIImageViewで初期化し、操作が完了したらターゲットで実行するセレクターを作成します。セレクターメソッドでは、新しく読み込んだ画像を設定します(または、見つからない場合は、別のプレースホルダー画像を設定します)。これで完了です。
NSOperationが完了する前にUIImageViewが削除されるまで、これは正常に機能します。たとえば、UIに前/次のセグメント化されたコントロールがあり、これらのUIImageViewが削除されて新しく追加されます(アプリで表示されているより大きな「アイテム」の一部です)ので、タップするのは非常に簡単ですこれらは急速に連続しています。
したがって、すべての画像が読み込まれる前にタップを開始することにした場合は、KABLAM!不幸なスレッドには無効なオブジェクトがあり、それを認識していません。:(
これを軽減するために私が見つけることができる最も近いものは、NSOperationのcancelメソッドとisCancelledメソッドです。ただし、カテゴリ内でキャンセルする操作オブジェクトを追跡することはできません。これは、正しく理解していれば、カテゴリはオブジェクトにIVARを追加できないためです。
多分それはカテゴリーがここで良い考えではないことを意味しますか?(泣き言:「しかし、私はカテゴリーをliiiiike!Waaah!」)
アドバイスをいただければ幸いです。