尝试在一次调用中从Web服务获取所有数据

时间:2017-01-25 18:48:50

标签: swift asynchronous alamofire

我有一个材料的网络服务,我试图从那个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)
      }
    })
  }

1 个答案:

答案 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)
   }
}