Я установил категорию Objective-C для класса UIImageView приложения iPhone. Миссия категории - помочь асинхронно загружать изображения на основе URL с кэшированием памяти / диска.
Теперь в UIImageView + Cache.m у меня есть доступ к NSOperationQueue, поэтому я могу начать поток загрузки. Я создаю объект, производный от NSOperation, инициализируемый URL-адресом изображения и целевым UIImageView, а также селектор для выполнения на целевом объекте после завершения операции. В методе селектора мы устанавливаем наше только что загруженное изображение (или, если оно не найдено, мы устанавливаем альтернативное изображение-заполнитель), и все готово!
Это работает нормально, пока UIImageView не будет удален до завершения NSOperation. Например, у меня есть предыдущий / следующий сегментированный элемент управления в моем пользовательском интерфейсе, который приводит к тому, что эти UIImageViews удаляются и добавляются заново (они являются частью более крупного «элемента», который просматривается в приложении), поэтому его очень легко нажать они в быстрой последовательности.
Так что, если вы решили начать постукивать до того, как все изображения загрузятся - КАБЛАМ! Несчастный поток имеет недопустимый объект и не знает об этом. :(
Самое близкое, что я могу найти, чтобы помочь смягчить это, - это методы cancel и isCancelled NSOperation, за исключением того, что вы не можете отслеживать, какой объект операции нужно отменить в категории, потому что - если я правильно понял - категории не могут добавлять IVAR к объектам!
Может быть, это означает, что категории здесь не лучшая идея? (Хнычет: "Но я люблю категории! Ваааа!")
Совет приветствуется!