2016-12-25 87 views
0

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

相关代码如下。

谢谢!

--------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() 
    } 

} 网站-------- --------类

-------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-------- 

从本质上讲,我想在某一个点来访问我的变量 “AR1”在我的代码中,但我不能。我试图返回值,但它在那一点上返回NULL。

这里有什么问题?

我试图像下面的代码:

import Foundation 
import UIKit 

class Web { 
    var ar1 = [Double]() 
    var ar2 = [Double]() 

    func getData(str: String) -> [Double] { 
    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!) 
        } 
       } 
      dump (self.ar1) // "ar1" accessible HERE (returns all elements) 
     } 
    }//end of request 
     //BUT I WANT TO RETURN "ar1" HERE ! 
     // So that I can use it in my MAIN class 
     dump (self.ar1) // "ar1" not accessible here (returns ZERO elements) 
     return self.ar1 
    } 
     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() 
} 
    } 
+0

您可能无法使用受版权保护的内容并保留在StackOverflow上的所有权利。请参阅http://stackoverflow.com/help/licensing –

回答

2

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

让我知道你是否需要任何进一步的帮助。

+1

当HTTP请求仍在接收来自服务器的响应时,您的返回语句提前返回值。您需要更改函数getData,以便它使用完成处理程序块。您还需要更改当前调用'getData'的代码,以便在完成处理程序回调中编写使用'ar1'的值的逻辑。 https://thatthinginswift.com/completion-handlers/ –