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 和 PromiseKit 链接 Alamofire 请求