2012-02-15 7 views
7

Tout d'abord les questions sont failry simiple .. si vous voulez juste voir ce qu'ils sont au bas de ce poste et vous les verrez en gras .. pour plus de détails, vous pouvez lire le reste de ce poste ...nsurlconnection demande asynchrone

Je suis juste en train de repasser mon NSURLConnection pour que ça fonctionne bien et que je le comprenne correctement. Il y a un manque profond d'exemples/tutoriels pour les connexions asynchrones sur Internet ou pas que je puisse trouver qui expliquer ce qui se passe avec un niveau de profondeur autre que d'obtenir la connexion qui fonctionne après avoir travaillé dessus semble assez simple. J'espère que cette question peut remplir le vide que je ressens est là pour les autres utilisateurs. Donc, dans mon fichier .h, j'ai importé les en-têtes de fondations et déclaré les méthodes nécessaires pour le reçu ou le manque de données reçues (erreurs, etc.).

.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> //add foundations 
//.. other headers can be imported here 

@interface MyViewController: UITableViewController { 

//Im not setting any delegates to access the methods because Is all happening in the same 
//place so I just use the key word 'self' when accessing the methods declared below 
//I'm not sure if this is the best thing to do but I wasn't able to get my head around declaring the delegate or how it would help me with the way I have set up my request etc. 

} 
- (IBAction)setRequestString:(NSString *)string; //this method sets the request and connection methods 

//these methods receive the response from my async nsurlconnection 
- (void)receivedData:(NSData *)data; 
- (void)emptyReply; 
- (void)timedOut; 
- (void)downloadError:(NSError *)error; 

donc c'est mon fichier d'en-tête .. assez simple pas beaucoup besoin expliquant.

.m

//call setRequestString from some other method attached to a button click or something 
[self setRequestString:@"rss.xml"]; 
//.. 

- (IBAction)setRequestString:(NSString *)string 
{ 
    //Set database address 
    NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http:www.comicbookresources/feeds/"]; // address not real jsut example 

    //append the string coming in to the end of the databaseURL 
    [databaseURL appendString:string]; 

    //prepare NSURL with newly created string 
    NSURL *url = [NSURL URLWithString:databaseURL]; 

    //AsynchronousRequest to grab the data 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     if ([data length] > 0 && error == nil){ 
      [self receivedData:data]; 
     }else if ([data length] == 0 && error == nil){ 
      [self emptyReply]; 
     }else if (error != nil && error.code == NSURLErrorTimedOut){ //used this NSURLErrorTimedOut from foundation error responses 
      [self timedOut]; 
     }else if (error != nil){ 
      [self downloadError:error]; 
     } 
    }]; 
} 

maintenant mis en place les méthodes qui ont été initialisées dans le fichier .h et appelé dans l'instruction if ci-dessus

- (void)receivedData:(NSData *)data 
{ 
    NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@", newStr); //logs recived data 
    //now you can see what data is coming in on your log 
    //do what you want with your data here (i.e. start parsing methods 
} 
- (void)emptyReply 
{ 
    //not sure what to do here yet? 
} 
- (void)timedOut 
{ 
    //also not sure what to do here yet? 
} 
- (void)downloadError:(NSError *)error 
{ 
    NSLog(@"%@", error); 
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A connection failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [errorAlert show]; 
} 

froide pour à peu près les bases de ce que j'ai fait juste là .. maintenant les questions que j'ai sont comme suit.

Première question: Où j'appelle NSURLConnection comme si

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
     { 

Ce qui se passe ici ce qui est le^pour est que l'exécution de ce bloc entier (y compris si les déclarations) sur un thread différent ou quelque chose ? parce que cela ressemble beaucoup à la mise en forme grand dispatch centrale mais légèrement différente.

Deuxième question: Que dois-je faire à l'intérieur emptyReply & TimedOut méthodes?

Troisième question: Comment pourrais-je intégrer la mise en cache dans tout cela? Je voudrais mettre en cache les réponses que je reçois de différentes demandes. c'est-à-dire avec mon setRequestString vous verrez qu'il y a un paramètre d'entrée string, donc je peux demander différents flux rss avec la même méthode .. Je dois trouver comment cacher ces réponses dans des caches individuelles .. mais je ne sais pas par où commencer il.

Enfin Si vous avez fait ce chemin jusqu'à présent, merci beaucoup d'avoir lu ma question. Heureusement, avec vos réponses, nous pouvons obtenir une solution plutôt sympa ... que d'autres peuvent utiliser pour eux-mêmes et choisir les morceaux dont ils ont besoin pour leur propre solution ..

Quoi qu'il en soit, merci beaucoup pour lire et j'attends vos réponses avec impatience ..même si elles sont juste des réfrences à des tutoriels ou des exemples que vous pensez pourraient m'aider .. tout est bon je veux juste comprendre parfaitement ce qui se passe et ce qui est une bonne solution.

Répondre

5
  1. En savoir plus sur les blocs dans la documentation Apple. C'est nouveau. Ou vous pouvez lire here
  2. Vous pouvez afficher des erreurs telles que la demande expiré, etc. Vous n'avez pas vraiment à les gérer séparément que l'erreur sauf si vous avez une logique spéciale.
  3. Essayez ceci pour la mise en cache

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL]; 
    
+0

merci pour la réponse. Cool va lire sur les blocs cet arvo. En ce qui concerne votre exemple de cache .. Je ne veux pas mettre en cache les réponses .. Je voudrais mettre en cache les réponses .. Cependant, je ne sais pas comment les gérer .. Si j'ai besoin d'une autre méthode pour cela .. ou que je mettez ma connexion nsurl dans une instruction if et utilisez les différentes politiques de cahce trouvées ici https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/Reference/Reference.html encore merci pour la réponse .. Je vais aller faire des recherches sur les blocs maintenant .. –

+0

très bonne réponse –

Questions connexes