(Réglé) NSMutableURLRequest timeoutInterval

Ben77650Ben77650 Membre
juillet 2014 modifié dans API UIKit #1

Bonjour à  tous.


 


J'effectue une requête sur une URL et j'aimerais qu'au bout de 20 secondes par exemple, ma requête s'arrête et affiche un message d'erreur de réseau, seulement à  ce moment la, après mes 20 secondes ma loadingView tourne toujours (comme si la requête s'exécutait toujours)


 


Voila mon code:



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        
        loadingView = [[UIView alloc] initWithFrame:CGRectMake(75, 200, 170, 170)];
        loadingView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
        loadingView.clipsToBounds = YES;
        loadingView.layer.cornerRadius = 10.0;
        
        actview = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        actview.frame = CGRectMake(65, 20, actview.bounds.size.width, actview.bounds.size.height);
        [loadingView addSubview:actview];
        
        loadingLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 80, 140, 22)];
        loadingLabel.backgroundColor = [UIColor clearColor];
        loadingLabel.textColor = [UIColor whiteColor];
        loadingLabel.adjustsFontSizeToFitWidth = YES;
        loadingLabel.text = @Téléchargement des annonces. Veuillez patientez svp...;
        loadingLabel.lineBreakMode = NSLineBreakByWordWrapping;
        loadingLabel.numberOfLines=0;
        loadingLabel.textAlignment = NSTextAlignmentCenter;
        [loadingLabel sizeToFit];
        [loadingView addSubview:loadingLabel];
        [self.view addSubview:loadingView];
        [actview startAnimating];
        
        [self getAllOffers];
    }
    return self;
}


- (void)getAllOffers {
    
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@%@", @http://www.myurl.com/monscript.php]];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.timeoutInterval = 20.0;

//Some code
}

Merci d'avance


Réponses

  • AliGatorAliGator Membre, Modérateur
    Bah tu la lances comment ta requête ? Suffit de passer un completionBlock et de traiter le cas d'erreur dedans pour jarter ta loadingView, non ?

  • [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

    //some stuff

    }];

    Je fais ça comme cela ;)

  • AliGatorAliGator Membre, Modérateur
    Et t'as pas de NSError dans ton completionHandler dans le cas où t'as un timeout?

    (Faut p'tet nous en dire un peu plus là , plutôt que nous laisser deviner ;))

  • NSError *error = nil;
        
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            if ([data length] >0 && error == nil)
            {
                id strResult=nil;
                NSError* erreur;
                strResult = [NSJSONSerialization JSONObjectWithData:data options:0 error:&erreur];
                if([strResult count]>0)
                {
                    int cpt;
                    
                    _liste = [[NSMutableArray alloc]init];
                    
                    for(cpt=0; cpt<[strResult count];cpt++)
                    {
                        NSDictionary *dicoTemp = [strResult objectAtIndex:cpt];
                        NSMutableArray* arrayTemp = [[NSMutableArray alloc]init];
                        
                       //Add data to Array
                    }
                }
                else if ([data length] == 0 && error == nil)
                {
                    UIAlertView *vide = [[UIAlertView alloc] initWithTitle:@Erreur
                                                                   message:@Rien n'a été téléchargé
                                                                  delegate:nil
                                                         cancelButtonTitle:@OK
                                                         otherButtonTitles:nil];
                    [vide show];
                    
                }
                else if (error != nil){
                    NSString* err=[NSString stringWithFormat:@Error = %@", error];
                    
                    UIAlertView *erreur = [[UIAlertView alloc] initWithTitle:@Erreur
                                                                     message:err
                                                                    delegate:nil
                                                           cancelButtonTitle:@OK
                                                           otherButtonTitles:nil];
                    [erreur show];
                }
            }
            }];
  • LarmeLarme Membre
    juin 2014 modifié #6

    Ouais, enfin, perso, c'est connectionError que je lirais plus que error.


    Pareil, tu créées un NSError *erreur, mais tu ne la lis pas pour vérifier ta sérialization.


    Toutes tes NSError ne vont pas se répercuter dans error parce que tu l'as décidé, hein !


  • J'ai pas compris, ce que tu as voulu dire


  • LarmeLarme Membre

    Déjà , je ferais :



    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    if (connectionError)
    {//Lire l'erreur}
    else
    {}
    }];
  • samirsamir Membre

    @Ben ce que veux dire @Larme c'est que tu as deux objets erreurs dans ton bloc et tu traite qu'un seul.


     


    1. connectionError : C'est l'objet erreur renvoyée par la méthode de NSURConnection sendAsynchro... si connectionError != nil ( par exemle un time out, pas de connexion internet,...)


     


    2. le deuxième objet erreur est celui que tu as créer :


             



    NSError* erreur;
    strResult = [NSJSONSerialization JSONObjectWithData:data options:0 error:&erreur];

    cette objet vas te renvoyer les erreurs oar rapport a la méthode JSONobject..... donc une erreur de parsing json.


     


    tout simplement il faut traiter les deux


  • Merci Larme cela fonctionne.


     


    J'aimerais savoir ce que contient NSError, afin d'adapter en fonction. C'est un dictionnaire ?


     


    Je voudrais faire une condition du genre (if Code == 1009) afficher "Pas de connexion réseau".


     


    D'ailleurs savez vous me dire les différents code d'erreur ainsi que les erreurs correspondantes svp ?


  • LarmeLarme Membre
    juin 2014 modifié #11
    Regarde la doc de NSError.
    C'est un truc "assez générique". Mais y'a le [error code], etc.
  • Ben77650Ben77650 Membre
    juin 2014 modifié #12

    Bon j'ai trouvé comment faire mon if, mais la doc ne liste pas les différentes erreurs possibles, j'aimerais bien si quelqu'un a ou à  défaut de toutes les avoir, avoir les plus courantes ;)


  • AliGatorAliGator Membre, Modérateur
    La doc (Programming Guide) détaille pourtant quand même pas mal pourtant

    Et si ça ne suffisait pas, y'a évidemment l'article de NSHipster sur le sujet.

    Donc c'est pas les infos qui manquent.
  • Ben77650Ben77650 Membre
    juin 2014 modifié #14

    Merci, mais je me vois mal faire 44 if avec toutes les erreurs existantes.


     


    Y'a pas moyens d'avoir les 5 (ou 10 maximum) erreurs les plus fréquentes s'il vous plait ?


     


    Sachant que j'ai déjà :


    -1009: NSURLErrorNotConnectedToInternet


    -1001: NSURLErrorTimedOut


Connectez-vous ou Inscrivez-vous pour répondre.