Ios 如何无限期地重试URL请求,直到成功使用Alamofire 5?

Ios 如何无限期地重试URL请求,直到成功使用Alamofire 5?,ios,swift,network-programming,alamofire,Ios,Swift,Network Programming,Alamofire,有没有建议使用Alamofire的RequestRetrier继续重试请求,直到请求成功 我遇到的问题是每次重试都会增加应用程序的内存。我有一个场景,用户可能会脱机发出请求,当他们重新连接时,请求最终应该会成功 不断地重试请求不是一种好的做法吗?如果网络呼叫失败几次,我是否应该使用计时器来重新创建网络呼叫?我是否应该使用其他机制等待网络活动,然后发送请求队列(如有任何建议,将不胜感激!) 下面是一个看到内存爆炸的示例。您只需将iPhone置于飞行模式(因此没有连接),内存将继续快速增长,因为在这

有没有建议使用Alamofire的RequestRetrier继续重试请求,直到请求成功

我遇到的问题是每次重试都会增加应用程序的内存。我有一个场景,用户可能会脱机发出请求,当他们重新连接时,请求最终应该会成功

不断地重试请求不是一种好的做法吗?如果网络呼叫失败几次,我是否应该使用计时器来重新创建网络呼叫?我是否应该使用其他机制等待网络活动,然后发送请求队列(如有任何建议,将不胜感激!)

下面是一个看到内存爆炸的示例。您只需将iPhone置于飞行模式(因此没有连接),内存将继续快速增长,因为在这种情况下,通话会频繁发生

import UIKit
import Alamofire    
class ViewController: UIViewController {
    let session = Session(configuration: .default)    
    override func viewDidLoad() {
        super.viewDidLoad()
        sendRequest()
    }
    func sendRequest() {
        session.request("https://www.google.com", method: .get, interceptor: RetryHandler())
            .responseData { (responseData) in
            switch responseData.result {
            case .success(let data):
                print(String(data: data, encoding: .utf8) ?? "nope")
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}


SCNetworkReachabilityFlags
更改时,应使用可达性获取通知。为什么重试网络请求会导致内存爆炸?不管是什么情况,您都可以创建一个递归函数,它具有一个称为线性退避重试(linearbackoffretry)的功能,该功能只是根据调用的尝试来延迟调用。例如,第一次尝试没有延迟,第二次尝试可能有1秒延迟,第三次尝试可能有2秒延迟,等等。在每次重试中,您可以取消会话并创建一个新会话,或者只重试现有会话。然后,您可以在
n
重试之后取消所有重试,并遵从Leo建议的网络可达性通知。我不知道为什么内存会增加bsod。似乎是个可能的错误。谢谢你的建议。这听起来是一个有趣的方法。所以我得到了一位Alamofire维护人员的回复,他说“Alamofire请求在单个请求中累积每次重试产生的所有底层URLRequests、URLSessionTasks和HTTPURLResponses。一旦请求被解除分配,它就被解除分配。您可以通过正确使用重试计时器和限制来控制这种增长。也就是说,您应该只使用定时衰减进行重试(正如Alamofire的RetryPolicy所做的那样),并且应该只重试有限次数的尝试。
class RetryHandler: RequestInterceptor {
    func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
        // keep retrying on failure
        completion(.retry)
    }
}(