【问题标题】:Swift: Chain multiple network request, AlamofireSwift:链接多个网络请求,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

标签: ios swift alamofire


【解决方案1】:

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

【讨论】:

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