Swift:链接多个网络请求,Alamofire

Posted

技术标签:

【中文标题】Swift:链接多个网络请求,Alamofire【英文标题】:Swift: Chain multiple network request, Alamofire 【发布时间】:2020-01-10 09:34:41 【问题描述】:

我有一个关于链接更多网络请求 (Alamofire) 的问题,但请求的数量有时可能是 4 有时是 9 等等,这取决于目标配置。 我有一个仪表板视图控制器,并且 VC 有 4-9 个嵌入式 VC,每个人都必须从 API 获取一些数据,这就是问题所在,他们都试图“同时”获取,但很多都随机失败。

我使用信号量来解决这个问题,但有时请求失败,不知道为什么。我认为一个请求会阻止另一个请求或类似的东西。

例如我有这个:

let dispatchQueue = DispatchQueue.global(qos: .background)
        dispatchQueue.async 
        if MDUtilites.isMediaPresent() 
                let _ = self.fetchMediaList()
                self.semaphore.wait()
                
            

我有大约 10 个这样的代码块,func 是:

func fetchMediaList() 
    MDApiManager.sharedInstance.fetchMediaList  (dict, status) in
        switch (status) 
        case .failed(let code, _, let description):
            print("failed:")
            print(code)
            print(description)
            self.semaphore.signal()
        case .success(_, _ , _):
            print("success")
            
            if let data = dict,
                let list = data.parseWith(type: MediaBase.self)?.list 
                self.newMedia = list
                NotificationCenter.default.post(name: Notification.Name(rawValue: MEDIA_UPDATE), object: nil)
                //                    self.mediaListSections = list
                //                    self.getCategories(data: list)
            
            self.semaphore.signal()
        case .unknown:
            print("DEBUG: unknown fetchMediaList")
            self.fetchMediaList()
        //                self.semaphore.signal()
        case .error(let aError):
            print(aError)
            self.semaphore.signal()
        
    

有人可以同时处理更多请求来解决这个问题吗?信号量有时工作有时不工作。

这是代码中的一些错误,信号量可以正常工作

【问题讨论】:

使用信号量通常是个坏主意。您可以使用 DispatchGroup 来处理多个并发请求的结束。有了通知,就更容易了。 您的 API 调用是并发的还是串行的??我的意思是 API 相互依赖,否则它们将独立执行。 没有不依赖的 API 【参考方案1】:

您的请求无需使用semaphore。由于您的请求是异步执行/彼此独立的,因此根据请求的类型,执行需要时间。您的每个controller 在加载到内存时都会获取此请求。在ViewDidLoad() 中获取它们。确保您将多个 controllers 正确添加到您的 parent controller

【讨论】:

这就是为什么开始时它是 3-4 个嵌入式 VC,但现在当我有 7-9 个 API 请求时这是一个问题,有时它们中的一些只是进入失败状态,例如 if这是后端问题,但不是。我将所有这些都放在一个单例类中,这样我就可以使用信号量但没有运气 您可以尝试使用 url 会话而不是 Alomfire 来为每个命中尝试命中 api。我的网络助手即使同时有 10 或 15 个请求也能正常工作。不要尝试单例类。

以上是关于Swift:链接多个网络请求,Alamofire的主要内容,如果未能解决你的问题,请参考以下文章

swift中第三方网络请求库Alamofire的安装与使用

使用 Swift 和 PromiseKit 链接 Alamofire 请求

在 Swift 中使用 Alamofire 网络进行解析时,如何在请求中发送内容类型?

Alamofire5 设置请求超时时间

Alamofire5 设置请求超时时间

使用 Swift 和 Combine 链接 + 压缩多个网络请求