【发布时间】: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