Renvoyer datatables de la class de saisie de données du Web?

J'essaye de créer une class qui me permettra d'get des données demandées d'un service Web. Je suis coincé sur la façon de returnner les valeurs.

// FooClass.m // DataGrabber is the class which is supposed to get values dataGrabber = [[DataGrabber alloc] init]; xmlSsortingng = [dataGrabber getData:[NSDictionary dictionaryWithObjectsAndKeys:@"news", @"instruction", @"sport", @"section", nil]]; 

Dans cet exemple, c'est censé avoir les nouvelles sportives. Le problème est que DataGrabber obtient datatables de manière asynchronous et finit par sauter de plusieurs methods de délégué NSURLConnection. Comment savoir dans FooClass quand datatables ont été reçues?

Le model de délégué utilisé avec un protocole ssortingct est très utile pour cela (c'est ainsi que DataGrabber le découvrirait quand NSURLConnection est fait, n'est-ce pas?). J'ai écrit un certain nombre d'API Web qui consumnt des informations XML et JSON de cette façon.

 // In my view controller - (void) viewDidLoad { [super viewDidLoad]; DataGrabber *dataGrabber = [[DataGrabber alloc] init]; dataGrabber.delegate = self; [dataGrabber getData:[NSDictionary dictionaryWithObjectsAndKeys:@"news", @"instruction", @"sport", @"section", nil]]; } 

Puis dans votre file DataGrabber.h:

 @protocol DataGrabberDelegate @required - (void) dataGrabberFinished:(DataGrabber*)dataGrabber; - (void) dataGrabber:(DataGrabber*)dataGrabber failedWithError:(NSError*)error; @end 

Et dans DataGrabber.m:

 - (void) getData:(NSDictionary*)dict { // ... Some code to process "dict" here and create an NSURLRequest ... NSURLConnection *connection = [NSURLConnection connectionWithRequest:req delegate:self]; } - (void) connectionDidFinishLoading:(NSURLConnection*)connection { // ... Do any processing with the returned data ... // Tell our view controller we are done [self.delegate dataGrabberFinished:self]; } 

Ensuite, assurez-vous que Foo implémente les methods du protocole DataGrabberDelegate pour gérer chaque cas.

Enfin, votre DataGrabber a une propriété delegate (assurez-vous que vous utilisez assign, pas retain pour éviter les cycles de conservation):

 @property (nonatomic, assign) id<DataGrabberDelegate> delegate; 

Et lorsque les charges asynchronouss NSURLConnection sont terminées à l'intérieur de DataGrabber, elles callbacklent votre UIViewController dans le protocole décrit ci-dessus afin que vous puissiez mettre à jour l'interface user. Si c'est une request, vous pouvez théoriquement vous débarrasser de DataGrabber et le mettre dans votre controller de vue, mais j'aime "séparer mes préoccupations" – API et View Controller restnt séparés. Il génère une couche supplémentaire, mais il garde le "code de traitement de text" hors des controllers de vue (spécifiquement pour le code d'parsing JSON et XML).

Je l'ai fait plusieurs fois avec succès – une autre key est qu'il est bon de fournir à l'user des informations sur le chargement d'une page – activer l'indicateur d'activité dans la barre d'état, lui montrer un indicateur UIActivityIndicator, etc. Lorsque le callback de votre délégué revient avec succès ou échec, vous vous en débarrassez.

Enfin, j'ai écrit un article de blog plus détaillé à ce sujet: Consumr des API Web sur l'iPhone

vous pouvez implémenter des notifications pour votre class DataGrabber qui se triggersront à chaque fois que vous recevez une certaine quantité de données (ou lorsque le téléchargement est terminé si vous le souhaitez), puis la méthode notifiée (consultez la section Notifications dans la documentation) vouloir.

Note: il serait utile que FooClass soit le délégué de DataGrabber

J'utilise également des notifications pour cela. Voici une bonne explication détaillée de la façon de configurer ceci.