Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何逐个下载和处理2组数据?_Ios_Swift_Swift2 - Fatal编程技术网

Ios 如何逐个下载和处理2组数据?

Ios 如何逐个下载和处理2组数据?,ios,swift,swift2,Ios,Swift,Swift2,我正在打一个webservice电话来获取数据列表。在我有了所有这些数据之后,我想对列表中的每一项进行web调用。以下是我目前掌握的代码: let zipcde:String = self.zipCode let username:String = "tr1gger" //webservice call var listZip = [String]() let wsUrl: NSURL = NSURL(string: "http://api.url.org/findNearbyT

我正在打一个webservice电话来获取数据列表。在我有了所有这些数据之后,我想对列表中的每一项进行web调用。以下是我目前掌握的代码:

let zipcde:String = self.zipCode
  let username:String = "tr1gger"
  //webservice call
  var listZip = [String]()
  let wsUrl: NSURL = NSURL(string: "http://api.url.org/findNearbyTheseCodesJSON?postalcode=" + zipcde + "&maxRows=100&country=US&radius=25&username=" + username)!

  let task = NSURLSession.sharedSession().dataTaskWithURL(wsUrl, completionHandler: { (data, response, error) -> Void in
    //will happen when task is complete

    if let urlContent = data {
      let jsonObject = JSON(data: urlContent)

      if let jsonDict:JSON = jsonObject["postalCodes"]{
        let postalCode = "postalCode"
        for var i:Int = 0; i < jsonDict.count; i++ {
          print("Property: \"\(jsonDict[i][postalCode])\"")
          listZip.append(String(jsonDict[i][postalCode]))
        }


        self.showLoadingMessage()
        self.listOfZips = listZip
        self.getStores()

      }
    }

  })
  task.resume()
让zipcde:String=self.zipCode
让用户名:String=“tr1gger”
//网络服务呼叫
var listZip=[String]()
让wsUrl:NSURL=NSURL(字符串:http://api.url.org/findNearbyTheseCodesJSON?postalcode=“+zipcde+”&maxRows=100&country=US&radius=25&username=“+username)!
让task=NSURLSession.sharedSession().dataTaskWithURL(wsUrl,completionHandler:{(数据,响应,错误)->中的Void
//将在任务完成时发生
如果让urlContent=data{
让jsonObject=JSON(数据:urlContent)
如果让jsonDict:JSON=jsonObject[“postalCodes”]{
让postalCode=“postalCode”
对于变量i:Int=0;i
self.getStores是一个函数,它启动for循环并为第一个列表中的每个项目调用webservice:

func getStores(){

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {

  for areaCode in self.listOfZips{

    let url = NSURL(string: "http://myUrl.thisPlace.net/getStores.php?zipcode=" + areaCode + "&ammoType=" + self.aType)!

    let task2 = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data2, response2, error2) -> Void in

      if let jsonObject2: NSArray = (try? NSJSONSerialization.JSONObjectWithData(data2!, options: NSJSONReadingOptions.MutableContainers)) as? NSArray{
        var storeName = [String]()
        var storeAddress = [String]()
        var storeId = [String]()
        var ammoStId = [String]()
        var ammoStock = [String]()
        var ammoPrice = [String]()

        for obj in jsonObject2{
          if let name: String = obj["storeName"] as? String{
            storeName.append(name)
            storeAddress.append((obj["storeAddress"] as? String)!)
            storeId.append((obj["storeId"]as? String)!)
          }
          else if let id: String = obj["storeId"] as? String{
            ammoStId.append(id)
            ammoStock.append((obj["ammoStock"] as? String)!)
            if let priceTemp: String = obj["ammoPrice"] as? String{
              ammoPrice.append(priceTemp)
            }
          }
        }
        var storeList = [StoreItem]()
        for var index:Int = 0; index < storeId.count; ++index{
          let sId = storeId[index]
          for var i:Int = 0; i < ammoStId.count; ++i{
            let aId = ammoStId[i]
            if sId == aId{
              //creating object
              let storeItem:StoreItem = StoreItem()
              storeItem.setAddress(storeAddress[index])
              storeItem.setName(storeName[index])
              storeItem.setId(Int(storeId[index])!)
              storeItem.setAmmoStock(Int(ammoStock[i])!)
              storeItem.setAmmoPrice(ammoPrice[i])
              storeList.append(storeItem)
            }
          }
        }
        self.storeListFinal.appendContentsOf(storeList)
      }

      self.myAlert.dismissViewControllerAnimated(true, completion: nil)
      self.tableView.reloadData()

    })

    task2.resume()
  }
})
func getStores(){
调度异步(调度获取全局队列(调度队列优先级后台,0){
用于self.listOfZips中的区号{
让url=NSURL(字符串:http://myUrl.thisPlace.net/getStores.php?zipcode=“+areaCode+”&AmomType=“+self.aType)!
让task2=NSURLSession.sharedSession().dataTaskWithURL(url,completionHandler:{(data2,response2,error2)->在中无效
如果让jsonObject2:NSArray=(尝试?NSJSONSerialization.JSONObjectWithData(data2!,选项:NSJSONReadingOptions.MutableContainers))作为?NSArray{
var storeName=[String]()
var storeAddress=[String]()
var storeId=[String]()
变量ammoStId=[String]()
var ammoStock=[String]()
var ammoPrice=[String]()
对于jsonObject2中的obj{
如果let name:String=obj[“storeName”]作为字符串{
storeName.append(名称)
storeAddress.append((obj[“storeAddress”]作为?字符串)!)
storeId.append((obj[“storeId”]作为?字符串)!)
}
否则,如果let id:String=obj[“storeId”]as?String{
ammoStId.append(id)
ammoStock.append((obj[“ammoStock”]作为?字符串)!)
如果让priceTemp:String=obj[“ammoPrice”]作为?字符串{
ammoPrice.append(priceTemp)
}
}
}
var storeList=[StoreItem]()
对于var索引:Int=0;索引
正如你所看到的,我在这个调用结束时填充了一个表。这个代码大约需要18-20秒才能完成。在我的android版本上大约需要2秒。我如何优化它


谢谢您的帮助。

您使用了shared
NSURLSession
,并且该会话似乎按照您的请求排队。辅助查询没有在同一时间执行,我认为这是性能低下的原因

您可以通过以下代码更改每个主机的最大并发连接数:

NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPMaximumConnectionsPerHost = 20;
在创建任何共享的
NSURLSession
之前,可能必须调用上述代码。为确保这一点,我建议您创建一个使用明确定义的配置的自定义NSURLSession


ps.IMO,如果可以的话,更改serve脚本以便服务器只需一次调用就可以提供结果是最好的解决方案。

您使用了shared
NSURLSession
,并且该会话似乎按照您的请求排队。辅助查询不会同时执行,我认为这是性能缓慢的原因

您可以通过以下代码更改每个主机的最大并发连接数:

NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPMaximumConnectionsPerHost = 20;
在创建任何共享的
NSURLSession
之前,可能必须调用上述代码。为确保这一点,我建议您创建一个使用明确定义的配置的自定义NSURLSession

顺便说一句,如果可以的话,最好的解决方案是更改服务脚本,使服务器只需一次调用就可以提供结果

我正在进行web服务调用以获取数据列表。在我拥有所有数据后,我希望对该列表上的每个项目进行web调用

这种情况正是关于高级NSOperations的WWDC 2015视频的主题。通过使用NSOperation封装您的每个网络“任务”,您可以创建所需的依赖项(web服务调用必须在其他任何事情发生之前成功完成),并将其他“任务”(每个项目的web调用)排队因此,它们都是独立且有序地执行的。你会发现,如果你以这种方式使用NSOperations,表达这种有序依赖关系的逻辑要容易得多。观看视频,你会明白我的意思

我正在进行web服务调用以获取数据列表。在我拥有所有数据后,我希望对该列表上的每个项目进行web调用

这种情况正是WWDC 2015高级NSOperations视频的主题。通过使用NSOperation来封装