Ios 如何逐个下载和处理2组数据?
我正在打一个webservice电话来获取数据列表。在我有了所有这些数据之后,我想对列表中的每一项进行web调用。以下是我目前掌握的代码: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
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来封装