首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:如何使用不同的NSURL依次遍历NSURLSession?

Swift:如何使用不同的NSURL依次遍历NSURLSession?
EN

Stack Overflow用户
提问于 2015-05-21 09:26:06
回答 1查看 791关注 0票数 0

基本上,我想遍历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“)中:

代码语言:javascript
复制
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 )

代码语言:javascript
复制
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个数据时添加一些代码。

附注:有没有更好的方法来做我想做的事?

EN

回答 1

Stack Overflow用户

发布于 2015-05-22 08:38:31

下面我的回答不是对你的问题的直接解决,而是对我的评论的跟进,解释了为什么你会随机得到你的回应。尽管如此,我相信它将很快让你找到你的解决方案。:)

打开调试控制台,多次启动此代码(改编自您的代码),并查看打印的结果。

代码语言:javascript
复制
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()
}
  • 1:

  • 2:

现在您可以看到,每个任务确实是按照循环索引依次启动的,但结果是异步返回的,这取决于每个任务从网络获取数据所需的时间。每次启动你的序列都不一样,因为网络速度当然不是恒定的。

在我的例子中,我使用字典而不是Array来存储结果,它允许我向您展示,您得到了正确请求的正确响应,只是由于任务的异步性质,您以随机顺序获得结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30369710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档