Помощь в проектировании объектов для асинхронного заполнения UIScrollView - PullRequest
1 голос
/ 05 декабря 2010

Коллектив приветствия,

Я новичок в Какао и мне поручено работать над прототипом приложения для iPhone и iPad под управлением 4.2.У меня возникли проблемы при разработке процесса, который будет засыпать данные в пользовательский объект, который я использую для заполнения UIScrollView.Каждый пользовательский объект отображает данные фильма (иллюстрации, ролики и т. Д.), И эти данные вызываются из службы REST.

Мне бы хотелось, чтобы этот объект Movie отвечал за его рендеринг и, следовательно, "отбирал" свои данныеМне нужен отдельный объект, который может выполнять реальные вызовы REST, синтаксический анализ JSON и т. д. Я пытался обернуть голову, используя делегаты, или обратные вызовы NSOperation или прямые обратные вызовы, чтобы доставить решение, но у меня возникли проблемы с определением того, какой путьпреследовать.

Я знаю, что мне нужно обрабатывать эти данные в фоновом режиме, чтобы поддерживать живой интерфейс в основном потоке, но я борюсь с тем, как спроектировать связи между этими объектами:

TheaterViewController //ViewController that contains the UIScrollView

В настоящее время я заполняю UIScrollView TheaterViewController 11 элементами MovieView (произвольное выделение) - MovieView показывает ActivityIndicator, чтобы дать пользователю знать, что он работает над доставкой контента

MovieItem  //a single movie and it's respective data

MovieView  //individual View that displays a single MovieItem content

DataAgent  //background-capable object that fetches data from app server

DataWarehouse //Singleton-designed class that maintains an NSMutableArray of MovieItem's

В моем текущем дизайне TheaterViewController заполняетUIScrollView с 11 MovieView.Каждый MovieView затем получает свои собственные данные.Я знаю, как заставить DataAgent проверить DataWarehouse на наличие содержимого, а если его нет, вызвать службу REST.Что я не знаю, как это сделать, это сообщить / вызвать / отправить в MovieView, что DataAgent завершил получение данных (желательно асинхронным способом), чтобы он мог отобразить законченное представление.

Может кто-нибудь указать мнек документу или к примеру, который выполняет этот тип асинхронного обратного вызова?

Заранее благодарим за любые указатели, которые вы, ребята, придумали -

1 Ответ

0 голосов
/ 05 декабря 2010

Делегация определенно будет хорошим маршрутом.Я бы сделал протокол DataAgentDelegate, который содержит метод @required, называемый чем-то вроде -(void)dataFetchComplete.Все это будет реализовано следующим образом:

В DataAgent.h

@interface DataAgent : NSObject {
    id<DataAgentDelegate> delegate;
}

@property (nonatomic, retain) id<DataAgentDelegate> delegate;

В DataAgent.m

- (void) fetchingComplete {
    if (delegate != nil) {
        [delegate dataFetchComplete];
    }
}

В MovieView.h

@interface MovieView : NSObject <DataAgentDelegate> {
    //...
}

В MovieView.m

- (void) startDataFetch {
    DataAgent *dataAgent = [[DataAgent alloc] init];
    dataAgent.delegate = self;
    [dataAgent startFetching];
}


- (void) dataFetchComplete {
    //render fetched assets in view 
}

Я не могу придумать ни одного конкретного примера программ для этого, но это очень распространенная вещь.Делегирование очень удобно, когда вы имеете дело с асинхронными событиями.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...