Est il possible de le faire Alamofire les demandes avec les tentatives
J'ai beaucoup d'endroits dans le code où Alamofire de requête/réponse sont traitées.
Chacun de ces demandes peuvent échouer à cause de certain problème intermittent (la plus courante est feuilletée réseau).
Je voudrais être en mesure de réessayer demande 3 fois avant de les renflouer.
La méthode simple serait d'avoir quelque chose comme ça
var errorCount = 0
func requestType1() {
let request = Alamofire.request(...).responseJSON { response in
if (isError(response) && errorCount < 3) {
errorCount += 1
request1()
}
if (isError(response)) {
handleError()
}
handleSuccess()
}
}
Cependant, je n'aime pas cette approche BEAUCOUP pour plusieurs raisons. La plus évidente est que j'ai besoin de mettre en œuvre ce type de code pour chaque type de demande (et j'ai quelque chose comme 15 d'entre eux).
Je suis curieux de savoir si il y a moyen de faire quelque chose comme (où les changements sont minimes et non intrusive)
let request = Alamofire.request(..., **3**)
- Pourriez-vous faire un wrapper qui prend la requête comme une fin de bloc? Alors au lieu d'appeler directement à la demande, vous avez la même demande de code dans le bloc d'appel de l'emballage? Rend plus facile de modifier le code.
- Carlos. Je pense que vous avez raison. J'ai oublié ceci :). Voulez-vous écrire une réponse?
- Bien sûr, donne-moi un peu de temps et je vais le faire
- tout vous expliquer comment vous l'avez acheté?
Vous devez vous connecter pour publier un commentaire.
Un des morceaux de sucre syntaxique que vous obtenez avec Swift, vous pouvez utiliser ceci:
Comme ceci:
Note le bloc est en dehors de la () de la fonction updateEvents, contrairement à l'endroit où vous auriez normalement s'attendre. Il ne fonctionne que si le bloc est la dernière chose dans la déclaration de la fonction.
Cela signifie que si vous arrive d'avoir un bloc comme votre Alamofire demande, vous pouvez l'envelopper avec votre fonctionnalité nouvelle tentative. Un peu compliquer problème est que vous voulez appeler un bloc dans le bloc. Pas une grosse affaire:
Et vous l'utilisez comme suit:
Sens tout ce que vous avez à faire est de trouver votre Alamofire les appels et les envelopper dans { } et mettre retryWrapper() avant. La logique de nouvelle tentative lui-même est seulement une fois.
Alamofire 4.0 a un
RequestRetrier
protocole que vous pouvez utiliser.https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#request-retrier
Exemple:
J'ai eu le même problème, et j'ai fait la demande pour une nouvelle tentative à l'aide de la
RequestRetrier
,should
méthode etrequest.retryCount
. Quelque chose comme ça:Bien ce que j'ai fait est le suivant, si la requête échoue, j'envoie un échec de la notification à quiconque en fait la demande. Ensuite, il est responsable de la nouvelle tentative de la demande. Trouve cela beaucoup plus facile.