我有一个材料的网络服务,我试图从那个ws获取我的所有材料。每个ws响应给我带来一个带有20个寄存器的JSON,并且有一个" next"指示要使用的下一个URL的属性。我把请求放在' while'阻止,但它不起作用。
我尝试使用信号量(第一次使用)来解决while块的问题,但我的应用程序在到达那里时被卡住了。
在这种情况下如何获取所有材料?
逻辑很简单:
所有材料我尚未获取:
带来更多20种材料;
更新屏幕;
编辑:
WebApi.sharedInstance.fetchDataFromWS()是对Alamofire.request()的调用
func loadMaterials() {
WebApi.sharedInstance.fetchDataFromWS(webservice: .materials, codeToFilterRequest: nil, completion: {
(json) in
for item in json["results"] {
Materials.materials.append(Material.deserializeJson(json: item.1))
}
self.collectionView.reloadData()
let semaphore = DispatchSemaphore(value: 0)
while (json["next"].string != "") {
WebApi.sharedInstance.fetchDataFromWS(url: json["next"].string!, completion: {
(json) in
for item in json["results"] {
Materials.materials.append(Material.deserializeJson(json: item.1))
}
self.collectionView.reloadData()
(semaphore).signal()
})
(semaphore).wait(timeout: DispatchTime.distantFuture)
}
})
}
答案 0 :(得分:0)
func loadMaterials(url: String) {
webApi.sharedInstance.fetchDataFromWS(webservice: .materials, codeToFilterRequest: nil, completion: {(json) in
for item in json["results"] {
Materials.materials.append(Material.deserializeJson(json: item.1))
}
self.collectionView.reloadData()
self.loadMaterials(url: json["next"].string)
}
}