2016-05-18 1 views
1

Je crée une application IOS en utilisant swift. Récemment, j'ai rencontré un bug bizarre. En essayant de vérifier si une URL est valide, je crée une requête avec l'URL et je vérifie la réponse. Je fais cette tâche avec dataTaskWithRequest de NSUrlSession. Le bug bizarre est que si l'URL est alibaba, la réponse revient après une longue période (plus de 20 secondes parfois). Pourquoi cela se produit-il? En ce qui me concerne il se produit uniquement avec cette URL spécifique. Voici un code bien que ce ne soit pas nécessaire.dataTaskWithRequest prend trop de temps pour une chaîne très spécifique

let request = NSMutableURLRequest(URL: validatedUrl) 
     request.HTTPMethod = "HEAD" 

     let session = NSURLSession.sharedSession() 

     let task = session.dataTaskWithRequest(request){ data, response, error in 
      // The response here returns after a very long time 
      let url = request.URL!.absoluteString 

J'apprécierais de l'aide les gars!

+0

Cela n'a pas de sens. Je vérifie s'il n'y a pas de résultat, donc le timeout n'est pas bon pour moi car il va provoquer la même réponse (et il aura encore longtemps attendre ce que je ne veux pas) En outre, cela n'arrive pas avec d'autres chaînes , donc ça ne peut pas être ça. –

Répondre

0

Vous récupérez le contenu d'une URL sur Internet. La vitesse à laquelle cela arrive est arbitraire. Cela dépend de la vitesse du serveur DNS qui recherche le nom d'hôte, de la vitesse du serveur Web qui répond à la requête, de la vitesse de la connexion Internet de l'utilisateur et de la vitesse de chaque réseau intermédiaire.

Vous pouvez supposer qu'il réussira ou qu'il expirera dans les trois minutes. Vingt secondes n'est même pas un peu inhabituel sur un réseau cellulaire.

Vous devriez probablement repenser ce que vous faites avec cette URL et pourquoi vous le faites, ou au moins essayer de trouver un moyen d'éviter que l'utilisateur attende pendant que vous récupérez l'URL.

+0

Hey, Ce code est utilisé pour une implémentation d'un navigateur dans mon application. L'utilisateur entre une URL, si l'URL n'est pas trouvée, il redirigera vers une recherche google. C'est la façon dont je pense que je pourrais, avez-vous une idée de comment puis-je éviter ce problème, peut-être dans une approche différente? –

+0

C'est probablement la seule raison valable pour que l'utilisateur attende. Après tout, l'utilisateur a demandé la page, et ils s'attendent probablement à ce qu'il apparaisse. Si je l'implémentais, je mettrais probablement un temporisateur de cinq secondes, et si vous n'avez pas reçu la réponse initiale du serveur ('' ... didReceiveResponse: ... ''), alors essayez de comprendre si c'est A. un problème de réseau temporaire ou B. un problème permanent. – dgatwood

+0

Essayez d'ouvrir simultanément deux tâches de données supplémentaires, l'une pour le site Google_204 et la seconde pour l'URL d'origine. Si la deuxième tentative à l'URL répond avec un 200, annuler la demande d'origine et afficher les résultats. Si la demande d'origine est terminée, annulez les demandes supplémentaires et affichez les résultats. Après cinq secondes, si aucune des demandes supplémentaires n'a répondu, annulez-les, car le réseau est mort. – dgatwood