NSOperation + Objective-C Категории = Плохая идея? - PullRequest
1 голос
/ 09 июля 2009

Я установил категорию Objective-C для класса UIImageView приложения для iPhone. Задача этой категории - помочь асинхронно загружать изображения на основе URL с помощью кэширования памяти / диска.

Теперь в UIImageView + Cache.m у меня есть доступ к NSOperationQueue , так что я могу запустить поток загрузки. Я создаю NSOperation -приведенный объект, инициализированный URL-адресом изображения и целевым UIImageView, а также селектор для выполнения на цели после завершения операции. В методе селектора мы устанавливаем наше недавно загруженное изображение (или, если не найдено, мы устанавливаем альтернативное изображение-заполнитель), и все готово!

Это работает нормально, пока UIImageView не будет удален до NSOperation завершается. Например, у меня есть предыдущий / следующий сегментированный элемент управления в моем пользовательском интерфейсе, который заставляет эти UIImageViews быть удалены и добавлены заново (они являются частью более крупного «элемента», который просматривается в приложении), поэтому его очень легко нажать они в быстрой последовательности.

Так что, если вы решите начать стучать до загрузки всех изображений - KABLAM! Несчастная нить имеет недопустимый объект и не знает его. (

Самым близким, что я могу найти, чтобы помочь смягчить это, являются методы cancel и isCancelled NSOperation, за исключением того, что вы не можете отследить, какой объект операции следует отменить в пределах категории, поскольку - если я правильно понимаю - Категории не могут добавлять IVAR к объектам!

Может быть, это означает, что категории здесь не очень хорошая идея? (Скулит: «Но я живу в категориях! Вааааа!» )

Совет приветствуется!

Ответы [ 3 ]

1 голос
/ 09 июля 2009

Я, вероятно, не использовал бы категорию для этой ситуации. Категории полезны, но обычно не нужны. Я бы использовал категорию, только если у вас есть на то веские основания. Что именно вы помещаете в категорию?

Я думаю, вы могли бы реализовать все это в подклассе NSOperation, что было бы лучшим решением. Поместите сохранение в представление изображения, чтобы оно не было освобождено до загрузки изображения, и отмените загрузку, если представление больше не отображается. Если это невозможно, тогда используйте подкласс UIImageView вместо использования категории.

0 голосов
/ 23 июля 2009

Сохраняете ли вы UIImageView от NSOperation? В противном случае imageView может быть освобожден до завершения NSOperation, что приводит к kablooi central. Вы должны сделать сохранение, а затем, как только вы сделали setImage, сделать релиз.

0 голосов
/ 09 июля 2009

Я бы сказал, что нет никакого вреда в переносе этого в ваш собственный подкласс UIImageView. Конечно, вам могут понравиться категории - но если они не выполняют свою работу, то зачем колебаться в переходе на дизайн, который делает?

...