comment utiliser sendAsynchronousRequest:file d'attente:completionHandler:
Deux partie question
Première partie:
Je suis en train de créer une requête Asynchrone à ma base de données. Je suis actuellement en train de le faire de manière Synchrone cependant je veux apprendre à la fois des façons d'améliorer ma compréhension de ce qui se passe.
Actuellement, j'ai mis en place mon appel Synchrone de ce genre.
- (IBAction)setRequestString:(NSString *)string
{
//Set database address
NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http://127.0.0.1:8778/instacodeData/"]; //imac development
//PHP file name is being set from the parent view
[databaseURL appendString:string];
//call ASIHTTP delegates (Used to connect to database)
NSURL *url = [NSURL URLWithString:databaseURL];
//SynchronousRequest to grab the data
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSError *error;
NSURLResponse *response;
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (!result) {
//Display error message here
NSLog(@"Error");
} else {
//TODO: set up stuff that needs to work on the data here.
NSString* newStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
NSLog(@"%@", newStr);
}
}
Je pense que ce dont j'ai besoin pour faire est de remplacer l'appel
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
avec la version Asynchrone
sendAsynchronousRequest:queue:completionHandler:
cependant, je ne suis pas sûr de ce qu'à passer à la file d'attente ou completionHandler... des exemples/solutions serait grandement apprécié.
Partie deux:
J'ai lu à propos de multi-tâches et je tiens à soutenir en faisant en sorte que mes demandes de connexion complète si il y a une interruption. J'ai été la suite de cette exemple
Il explique comment gagner plus de temps, si une interruption se produit, je comprends ce que sa fait.. mais pas comment l'appliquer à cet égard? si vous avez des exemples ou des tutoriels pour m'aider à comprendre comment l'appliquer, ce serait génial!
Vous devez vous connecter pour publier un commentaire.
Partie 1:
NSURLErrorTimedOut
est la valeur acceptée surERROR_CODE_TIMEOUT
.sendAsynchronousRequest:urlRequest queue:queue completionHandler:
a été dépréciée dans iOS 9Voici un exemple:
Pour la file d'attente param, essayez cette magie:
Cela fonctionne très bien si vous êtes à la mise à jour de l'INTERFACE utilisateur sur l'achèvement de la demande depuis la file d'attente principale est le thread principal. Il vous donne le comportement antérieur de NSURLConnection. Toutefois, si vous prévoyez sur l'écriture dans le fichier ou la décompression, vous pouvez compléter sur un arrière-plan de la file d'attente, puis envoi asynchrone à la file d'attente pour les mises à jour de l'INTERFACE utilisateur.
Je travaille sur un problème similaire, j'ai posté cette question et a obtenu une réponse claire ici, j'espère que ça aide à la Partie 2.
Pour la partie 1 de ce que les autres mentionnés ici sont bons, mais vous avez besoin d'ajouter une autre case (j'ai modifié une réponse ci-dessous). Il est possible que votre demande sera de retour dire une Erreur 404 (page non trouvée) dans ce cas, vous ne sera pas obtenir de l'erreur et les données seront > 0. Le 200 est une bonne réponse, vous pouvez aussi consulter les StatusCode pour 404 ou quoi que ce soit.
Depuis
sendAsynchronousRequest:urlRequest queue:queue completionHandler:
a été dépréciée dans iOS 9, et il suggère d'utiliserNSURLSession
du-dataTaskWithRequest:completionHandler:
à la place. Il est disponible depuis iOS 7 et versions ultérieures.Original:
Par NSURLSession:
sendAsynchronousRequest
a été déprécié en Swift. Passer àdataTaskWithRequest
, heureusement qu'il est utilisé peu de la même manière.