J'ai plus de 100 demandes.J'ai besoin d'envoyer une nouvelle demande lorsque le dernier est fait, de sorte que le serveur ne renverra pas le code d'erreur - 429. Comment faire cela par afnetworking 3.0?Envoyer la demande suivante quand la dernière est terminée
Répondre
Je ne suis pas très familier avec les API spécifiques de AFNetworking
, mais vous pouvez configurer:
- Un tableau variable contenant toutes vos demandes en attente,
- Une méthode appelée (par exemple)
sendNext()
qui supprime la première entrée du tableau, effectue la requête de manière asynchrone et, à l'intérieur du bloc d'achèvement, appelle lui-même.
Bien sûr, vous aurez besoin d'une condition de terminaison, et c'est tout simplement d'arrêter lorsque le tableau devient vide.
thx.C'est la façon de résoudre le problème dans mon code.Je suis à la recherche d'un meilleur moyen par afnetworking. – lsdoy
Ce serait génial s'il avait une sorte de fonctionnalité de lot/file d'attente. Je n'ai pas utilisé le cadre cependant. –
Il y a 2 approches qui peuvent traiter votre problème.
Tout d'abord, créez une file d'attente d'opérations et ajoutez toutes les demandes à la file d'attente. Après cela, créez une opération de votre nouvelle demande, puis ajoutez la dépendance à toutes les demandes dans la file d'attente. Par conséquent, votre nouvelle opération (exécutera la nouvelle requête) sera effectuée après la dernière requête. En second lieu, vous pouvez utiliser dispatch_barrier_async, qui va créer un point synchronisé sur votre file d'attente concurrente. Cela signifie que vous devez créer une file d'attente de concurrence pour exécuter votre requête 100+, et que les blocs dispatch_barrier_async dans votre file d'attente personnalisée exécuteront la nouvelle requête.
Thanks Sendoa for the link to the GitHub issue where Mattt explains why this functionality is not working anymore. There is a clear reason why this isn't possible with the new NSURLSession structure; Tasks just aren't operations, so the old way of using dependencies or batches of operations won't work.
I've created this solution using a dispatch_group that makes it possible to batch requests using NSURLSession, here is the (pseudo-)code:
// Create a dispatch group
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < 10; i++) {
// Enter the group for each request we create
dispatch_group_enter(group);
// Fire the request
[self GET:@"endpoint.json"
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject) {
// Leave the group as soon as the request succeeded
dispatch_group_leave(group);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
// Leave the group as soon as the request failed
dispatch_group_leave(group);
}];
}
// Here we wait for all the requests to finish
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// Do whatever you need to do when all requests are finished
});
I want to look write something that makes this easier to do and discuss with Matt if this is something (when implemented nicely) that could be merged into AFNetworking. In my opinion it would be great to do something like this with the library itself. But I have to check when I have some spare time for that.
Cette question duplication possible de AFNetworking 3.0 AFHTTPSessionManager using NSOperation. Vous pouvez suivre le commentaire @Darji pour quelques appels, Pour 100+ appel ajouter ces classes d'utilité https://github.com/robertmryan/AFHTTPSessionOperation/. Il est très peu pratique d'envoyer simultanément plus de 100 requêtes. Si possible, essayez de le réduire.
files d'attente d'opération? – holex
essayez la file d'attente d'opération par lots – iOS