一尘不染

有没有办法通过重试来执行Alamofire请求

swift

我在代码中有很多地方可以处理Alamofire请求/响应。

由于某些间歇性问题(最常见的是不稳定的网络),每个请求都可能失败。

我希望能够在重试前重试请求3次。

直接的方法是拥有类似的东西

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()
   }
}

但是,出于多种原因,我不喜欢这种方法。最明显的是,我将需要为每种请求类型实现这样的代码(并且我有15种这样的代码)。

我很想知道是否有办法做类似的事情(变化很小且非侵入性)

let request = Alamofire.request(..., **3**)

阅读 371

收藏
2020-07-07

共1个答案

一尘不染

通过Swift获得的语法糖之一就是可以使用以下代码:

public func updateEvents(someNormalParam: Bool = true, someBlock: (Void->Void))

像这样:

updateEvents(someNormalParam: false) {...}

请注意,该块位于updateEvents函数的()外部,与您通常期望的相反。仅当块是函数声明中的最后一个东西时,它才起作用。

这意味着,如果碰巧遇到了诸如Alamofire请求之类的阻止,则可以使用重试功能有效地包装它。一个稍微复杂的问题是您想在块内调用一个块。没什么大不了的:

func retryWrapper(alamoBlock: (Void->Request)) {
   alamoblock().responseJSON() {
       //Your retry logic here
   }
}

您可以像这样使用它:

retryWrapper() {
    Alamofire.request(method, targetUrl, parameters: parameters, encoding: encoding)
}

这意味着您要做的就是找到您的Alamofire调用,并将其包装在{}中,然后将retryWrapper()放在前面。重试逻辑本身仅存在一次。

2020-07-07