Вопрос

У меня есть вопрос о переопределении методов автоматического сгенерированного доступа. Следующее не будет работать (я верю), потому что каждый добитель ссылается на другую дому. Есть ли правило, что методы Accessor не должны использовать другие методы доступа, или вам просто нужно следить за этими ситуациями индивидуально?

-(UIImage *) image{

    if(image == nil){
        if(self.data == nil){
            [self performSelectorInBackground: @selector(loadImage) withObject: nil]
        }else{
            self.image = [UIImage imageWithData: self.data];
        }
    }

    return image;
}

-(NSData *) data {

    if(data == nil){
        if(self.image == nil){
            [self performSelectorInBackground: @selector(loadData) withObject: nil]
        }else{
            self.data = UIImageJPEGRepresentation(self.image, 0.85);
        }
    }

    return data;
}

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

Это было полезно?

Решение

Во-первых, не будь слишком умным для своего добра. Если вы хотите преодолеть некоторое узкое место, сначала меру и убедитесь, что это действительно там. Я верю, что оба UIImage и NSData Сделайте некоторую внутреннюю ленивую нагрузку, так что ваш код может быть существенно бесполезным. Во-вторых, даже если вы действительно хотели сделать что-то подобное вручную, попробуйте разделить кэширующий код в отдельный класс, чтобы вы не загрязняете код основного класса.

Нет правила о доступов (по крайней мере, нет, что я знаю), потому что люди не делают особой ленивой погрузки в аксессуары. Иногда я захожусь бесконечным циклом, вызванным ленивым [UIViewController loadView] в комбинации с [UIViewController view], но это об этом.

Другие советы

Нет ничего, что запрещает это, но вы определенно записываете какой-то запутанный код. По сути, эти два свойства имеют круговую зависимость. Это трудно как прочитать, так и отладку. Неясно, почему вы хотите «загрузить данные», прежде чем «загрузить изображение», или почему вы также хотите поддержать «Загрузка изображения», прежде чем «загружать данные», или действительно, как два свойства действительно две разные вещи.

то, что вы на самом деле делаете в этом примере, могут занять много времени для загрузки; Лучше всего убедиться, что он безопасен в потоке.

Кроме того, было бы даже лучше, если бы вы сделали объект данных реального поставщика данных (обычно используя протоколы), отдельно от класса, а для создания контейнера изображений разоблачить, что он обрабатывает лениво нагруженный объект (который может вызвать ряд от некоторых люди).

В частности, вы можете захотеть вызвать данные нагрузки / изображения от провайдера, вызовите его от AweakeFromnib (например) - тогда загрузчик запускается и загружает данные на вторичную нить (ESP. если загружено). Дайте поставщику данных обратный вызов, чтобы информировать представление о том, что изображение готово (обычно использующее протоколы). После того, как представление принимает непреодолимый образ, невернил поставщику данных.

Наконец, если вы имеете дело с приложенными ресурсами, «Система» будет кэш некоторым из этого для вас SOO, вы бы пытаетесь работать против того, что уже оптимизировано за кулисами.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top