基本上,我想遍历4个网页,从每个页面获得6个数据,在循环结束时在一个数组中总共有24个数据,然后在message.text标签上显示该数组的最后一个添加的数据(数组中的第24个对象)/(第4个网页的第6个数据)。
信息:
( i)我想浏览的4个网页:
http://apims.doe.gov.my/apims/hourly1.php
http://apims.doe.gov.my/apims/hourly2.php
http://apims.doe.gov.my/apims/hourly3.php
http://apims.doe.gov.my/apims/hourly4.php
NSURLSession任务从页面获取6个数据("AQI1“、"AQI2”、"AQI3“、"AQI4”、"AQI5“、"AQI6"),并将其添加到空字符串数组(”AQI“)中:
var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as NSString!
var cutCut = urlContent.componentsSeparatedByString("<td>Kota Tinggi</td>")
var cut = cutCut[1].componentsSeparatedByString("<b>")
var arr1 = cut[1].componentsSeparatedByString("</b>")
var AQI1 = arr1[0] as! String
var arr2 = cut[2].componentsSeparatedByString("</b>")
var AQI2 = arr2[0] as! String
var arr3 = cut[3].componentsSeparatedByString("</b>")
var AQI3 = arr3[0] as! String
var arr4 = cut[4].componentsSeparatedByString("</b>")
var AQI4 = arr4[0] as! String
var arr5 = cut[5].componentsSeparatedByString("</b>")
var AQI5 = arr5[0] as! String
var arr6 = cut[6].componentsSeparatedByString("</b>")
var AQI6 = arr6[0] as! String
self.AQI.extend([AQI1, AQI2, AQI3, AQI4, AQI5, AQI6])( iii) Var "taskerror“作为布尔值创建,以检查任务中不需要的错误,并在前面创建一个Func ERROR( ),以便在最后运行Var "taskerror”= true。
这里是整个代码,我把它放在一个IBAction按钮下(我在按钮之前创建了var AQI = String )
AQI.removeAll(keepCapacity: true)
var pages = ["1", "2", "3", "4"]
for object in pages {
var url = NSURL(string: "http://apims.doe.gov.my/apims/hourly" + object + ".php")
var task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
var taskerror = false
if error == nil {
var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as NSString!
var cutCut = urlContent.componentsSeparatedByString("<td>Kota Tinggi</td>")
var cut = cutCut[1].componentsSeparatedByString("<b>")
var arr1 = cut[1].componentsSeparatedByString("</b>")
var AQI1 = arr1[0] as! String
var arr2 = cut[2].componentsSeparatedByString("</b>")
var AQI2 = arr2[0] as! String
var arr3 = cut[3].componentsSeparatedByString("</b>")
var AQI3 = arr3[0] as! String
var arr4 = cut[4].componentsSeparatedByString("</b>")
var AQI4 = arr4[0] as! String
var arr5 = cut[5].componentsSeparatedByString("</b>")
var AQI5 = arr5[0] as! String
var arr6 = cut[6].componentsSeparatedByString("</b>")
var AQI6 = arr6[0] as! String
self.AQI.extend([AQI1, AQI2, AQI3, AQI4, AQI5, AQI6])
} else {
taskerror = true
}
dispatch_async(dispatch_get_main_queue()) {
if taskerror {
self.ERROR()
} else {
if self.AQI.count == 24 {
self.message.text = self.AQI[23]
}
}
}
})
task.resume()
}我的问题是:
1)在4个URL上运行任务的顺序是随机的,导致在数组AQI中显示6个数据集的随机序列,因此阵列AQI中的最后一个(24)对象是不固定的,即使来自第4个URL的最后一个数据没有改变。
2)在使用println(self.AQI)在message.text上显示AQI23之前,可以看到6组数据是随机排列的。
3)在var任务之前使用println(object)显示循环运行在URL "1“、"2”、"3“和"4”之间。但是如果放置在var任务中,它将显示循环是如何随机运行的(例如"2“、"4”、"3“、"1"),从而得到(2)中提到的相应的随机排列的AQI。
我的问题是
1)为什么循环在任务中随机运行?(不按照set var pages = "1“、"2”、"3“、"4”)
2)如何使任务在循环中有序地运行,使数组AQI中的最后一个对象(24)始终是相同的?
注意:我知道如果我想要最后的数据,我可以只运行第四个URL,但是我想在以后需要所有24个数据时添加一些代码。
附注:有没有更好的方法来做我想做的事?
发布于 2015-05-22 08:38:31
下面我的回答不是对你的问题的直接解决,而是对我的评论的跟进,解释了为什么你会随机得到你的回应。尽管如此,我相信它将很快让你找到你的解决方案。:)
打开调试控制台,多次启动此代码(改编自您的代码),并查看打印的结果。
var results = [Int:[String]]()
for index in 1...4 {
println("Loop index: \(index)")
var url = NSURL(string: "http://apims.doe.gov.my/apims/hourly\(index).php")
var task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
var taskerror = false
if error == nil {
var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as NSString!
var cutCut = urlContent.componentsSeparatedByString("<td>Kota Tinggi</td>")
var cut = cutCut[1].componentsSeparatedByString("<b>")
var arr1 = cut[1].componentsSeparatedByString("</b>")
var AQI1 = arr1[0] as! String
var arr2 = cut[2].componentsSeparatedByString("</b>")
var AQI2 = arr2[0] as! String
var arr3 = cut[3].componentsSeparatedByString("</b>")
var AQI3 = arr3[0] as! String
var arr4 = cut[4].componentsSeparatedByString("</b>")
var AQI4 = arr4[0] as! String
var arr5 = cut[5].componentsSeparatedByString("</b>")
var AQI5 = arr5[0] as! String
var arr6 = cut[6].componentsSeparatedByString("</b>")
var AQI6 = arr6[0] as! String
results[index] = [AQI1, AQI2, AQI3, AQI4, AQI5, AQI6]
} else {
taskerror = true
}
dispatch_async(dispatch_get_main_queue()) {
if taskerror {
println(taskerror)
} else {
println("Result index: \(index) - Content: \(results[index]!)")
}
}
})
task.resume()
}


现在您可以看到,每个任务确实是按照循环索引依次启动的,但结果是异步返回的,这取决于每个任务从网络获取数据所需的时间。每次启动你的序列都不一样,因为网络速度当然不是恒定的。
在我的例子中,我使用字典而不是Array来存储结果,它允许我向您展示,您得到了正确请求的正确响应,只是由于任务的异步性质,您以随机顺序获得结果。
https://stackoverflow.com/questions/30369710
复制相似问题