来自viewdidload操作顺序的web内容中的数组很奇怪

时间:2016-02-13 18:40:51

标签: ios swift

我正在开发一个新的应用程序,这个应用程序都是关于从Web内容组织信息。它将是一个财务应用程序,用于监控道琼斯琼斯的股息收益率。要做到这一点需要几个步骤,但我现在正在第一步工作。我想把道琼斯的30家公司拿出来,查看他们目前的收益率,然后根据这个数字对它们进行排名。现在我更新一个数组,给我所有30家公司的收益率(即[2.7,3.6,5.5,1.3等......])。以下是我目前的代码,问题如下:

let dowDic = ["MMM", "AXP", "AAPL", "BA", "CAT", "CVX", "CSCO", "KO", "DIS", "DD", "XOM", "GE", "GS", "HD", "IBM", "INTC", "JNJ", "JPM", "MCD", "MRK", "MSFT", "NKE", "PFE", "PG", "TRV", "UTX", "UNH", "VZ", "V", "WMT"]

var dowYield = [1.11, 2.11, 3.11, 4.11, 5.11, 6.11, 7.11, 8.11, 9.11, 1.11, 1.11, 2.11, 3.11, 4.11, 5.11, 6.11, 7.11, 8.11, 9.11, 1.11, 1.11, 2.11, 3.11, 4.11, 5.11, 6.11, 7.11, 8.11, 9.11, 1.11]

var counter = 0

@IBOutlet var label: UILabel!


@IBAction func refresh(sender: AnyObject) {

    print(dowYield)

}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.





    print(dowDic.indexOf("WMT"))



    for x in dowDic {

        print(x)

        let url = NSURL(string:"http://finance.yahoo.com/q?s=\(x)")!

        print(url)

        let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in

            //will happen after complete

            if let urlContent = data {

                let webContent = NSString(data: urlContent, encoding: NSUTF8StringEncoding)

                let websiteArray = webContent?.componentsSeparatedByString("<th scope=\"row\" width=\"48%\">Div &amp; Yield:</th><td class=\"yfnc_tabledata1\">")

                if websiteArray!.count > 0 {

                    let nextWebsiteArray = websiteArray![1].componentsSeparatedByString(" </td></tr>")

                    if nextWebsiteArray.count > 0 {

                        let websiteSum = nextWebsiteArray[0].componentsSeparatedByString(" (")

                        if websiteSum.count > 0 {

                            let finalYield = websiteSum[1].componentsSeparatedByString("%")

                            let WTF = Double(finalYield[0])

                            print(finalYield[0])



                            self.dowYield[self.counter] = WTF!


                            self.counter++


                        }


                        }

                    }

                }




            }






        task.resume()



    }



    print("flag")

    print(dowYield)




}

我希望该应用更新阵列&#39; dowYield&#39;稍后在viewDidLoad中访问它,但我只能使用按钮获取更新的打印输出。打印屏幕当前首先打印出股票代码和网址,所有这些都是。然后它跳到代码的底部并打印标记&#39;文本,然后是未经编辑的原始数组&#39; dowYield&#39;。然后它逐个打印出新的Yields。有关此处操作顺序的任何见解以及如何在viewDidLoad中访问更新的数组以供将来操作我想要使用这些新信息吗?谢谢!

1 个答案:

答案 0 :(得分:0)

这是异步代码的工作原理。你开始运行一个异步作业,它会继续运行,直到它完成,一段时间后。

将此视为派遣某人为您执行差事。在你要求他们执行差事后的那一刻,它仍然没有完成,你不知道他们需要多长时间才能完成。所以你去做其他事情,等他们回来告诉你工作已经完成。

这就是数据任务中的完成块的用途。它的代码将在以后保存,并在数据任务完成运行后执行。您可以确定,直到viewDidLoad退出后才会调用该代码。

您要做的是在完成块内添加一个调用,使用dispatch_async(dispatch_get_main_queue())在数据下载后更新主线程上的UI。