2010-12-04 8 views
1

Salutations collective,Aide avec la conception d'objets pour Asynchronous Population de UIScrollView

Je suis nouveau à Cocoa et ont été chargés de travailler sur une application prototype pour iPhone et iPad en cours d'exécution 4.2. J'ai des difficultés à concevoir un processus qui remplira les données dans un objet personnalisé que j'utilise pour remplir un UIScrollView. Chaque objet personnalisé affiche des données de film (illustration, distribution, etc.) et ces données sont appelées à partir d'un service REST.

Je voudrais que cet objet Movie soit responsable de son rendu et donc "farm out" ses données ont besoin d'un objet séparé qui peut faire les appels REST réels, l'analyse syntaxique JSON, etc. J'ai essayé d'envelopper ma tête autour de l'utilisation de délégués, ou NSOperation ou callbacks directs pour fournir une solution, mais j'ai du mal à discerner quelle voie à suivre.

Je sais que je dois traiter ces données en arrière-plan, pour garder l'interface utilisateur en vie sur le thread principal, mais je lutte avec la façon de concevoir les liens entre ces objets:

TheaterViewController //ViewController that contains the UIScrollView 

Actuellement, je suis peuplant la UIScrollView de TheaterViewController avec 11 (attribution arbitraire) des éléments de MovieView - MovieView montre un ActivityIndicator pour informer l'utilisateur qu'il travaille sur la fourniture du contenu

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 

Dans ma conception actuelle, TheaterViewController renseigne le UIScrollView w 11 MovieView. Chaque MovieView va ensuite obtenir ses propres données. Je sais comment obtenir DataAgent pour vérifier DataWarehouse pour son contenu et s'il n'est pas présent, puis appelez le service REST. Ce que je ne sais pas comment faire, c'est informer/callback/post à MovieView que DataAgent a fini d'obtenir les données (de préférence de manière asynchrone) afin qu'il puisse afficher sa vue complète.

Quelqu'un peut-il me diriger vers un document, ou un exemple qui fait ce genre de processus de rappel asynchrone?

Merci à l'avance pour tous les pointeurs vous bonnes gens viennent avec -

Répondre

0

délégation serait certainement une bonne route à suivre. Je voudrais faire un protocole DataAgentDelegate qui contient une méthode @required appelée quelque chose comme -(void)dataFetchComplete. Il serait tout mis en œuvre comme suit:

Dans DataAgent.h

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

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

Dans DataAgent.m

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

Dans MovieView.h

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

En MovieView.m

Je ne peux pas penser à des exemples de programmes spécifiques pour cela, mais c'est une chose très courante à faire. La délégation est très pratique lorsque vous traitez des événements asynchrones. J'espère que ça aide!

+0

Arman - Merci pour votre réponse. Je vais brancher cette solution dans ma source et voir comment elle se dérobe. Je jette aussi un coup d'œil aux solutions basées sur GCD utilisant dispatch_get_global_queue(). –

Questions connexes