访问给定函数之外的变量

时间:2016-12-25 09:15:02

标签: swift variables access completion

我按照Gurdev的建议尝试了完成处理程序并得到了一些东西。它确实在MAIN函数中返回我的数组的值。但问题是一样的:我必须使用Sleep()函数3秒才能完成HTTP请求。这就像硬编码,因为它可能需要少于或超过3秒才能完成。当我删除Sleep()命令时,我最终返回一个VOID数组。

相关代码如下所示。

谢谢!

<REQUEST_FORMAT>

}       -------- Web类--------

  --------Web Class--------
  import Foundation
  import UIKit

  class Web {

      var ar1 = [Double]()

      var ar2 = [Double]()

      func getData(str: String, completion: (_ result: [[Double]]) -> Void) {

    let request = NSMutableURLRequest(url: URL(string: str)!)

    httpGet(request as URLRequest!){
        (data, error) -> Void in
        if error != nil {
            print(error ?? "Error")
        } else {
            let delimiter = "\t"
            let lines:[String] = data.components(separatedBy: CharacterSet.newlines) as [String]

        for line in lines {
                var values:[String] = []
                if line != "" {
                    values = line.components(separatedBy: delimiter)
                    let str1 = (values[0])//FIRST COLUMN
                    let str2 = (values[1])//SECOND COLUMN
                    let db1 = NumberFormatter().number(from: str1)?.doubleValue
                    self.ar1.append(db1!)
                    let db2 = NumberFormatter().number(from: str2)?.doubleValue
                    self.ar2.append(db2!)

                }

            }

        }

    }//end of request

  sleep(3) // This delay sends data to MAIN, Otherwise NOT

  let dta = [self.ar1, self.ar2]

  completion(dta)

   }

  func httpGet(_ request: URLRequest!, callback: @escaping (String, String?) -> Void) {
     let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: {
        (data, response, error) -> Void in
        if error != nil {
            callback("", error!.localizedDescription)
        } else {
            let result = NSString(data: data!, encoding:
                String.Encoding.ascii.rawValue)!
            callback(result as String, nil)
        }
      })
      task.resume()
   }

基本上,我正在尝试访问我的变量&#34; ar1&#34;在我的代码中的某一点,但我不能。我试图返回值,但它在那时返回NULL。

这里有什么问题?

我尝试了以下代码:

-------Call In Class--------
 Web().getData (str:   "https://dl.dropboxusercontent.com/s/f6j7w7zeqaavzqw/s02.txt?dl=0")
        {
        (result: [[Double]]) in

            let x = result[0]
            let y = result[1]
 }
-------Call In Class--------

1 个答案:

答案 0 :(得分:2)

在您的代码中,您将从方法的return语句返回ar1,而在{Aysnchronous回调完成处理程序中设置ar1的值。您应该使用完成处理程序块来尝试访问ar1的值。 HTTPGet函数在异步模式下运行,ar1中的值在回调处理程序块中设置。

如果您需要任何进一步的帮助,请与我联系。