快速从闭包中获取变量的值

Posted

技术标签:

【中文标题】快速从闭包中获取变量的值【英文标题】:get the value of variable out of closure swift 【发布时间】:2016-06-30 03:02:00 【问题描述】:

所以我有一个名为 task 的闭包,它是一个发布请求,我有一个名为 values 的全局变量,我试图将“values”的值设置为我从存储在变量中的数据库中检索回来的数据称为“数组”。不用担心 tableview.reloadData 部分,这已经完成了。我只是想知道如何从关闭中获得价值。

var values:NSArray = []

@IBOutlet weak var Open: UIBarButtonItem!
override func viewDidLoad() 
    super.viewDidLoad()


    Open.target = self.revealViewController()
    Open.action = #selector(SWRevealViewController.revealToggle(_:))
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    get()
    print ("values=\(values)")


func get()       
    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.percyteng.com/orbit/getAllpostsTest.php")!)
    request.HTTPMethod = "POST"
    let postString = "user=\("ios")"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
        data, response, error in
        if error != nil 

            print("error=\(error)")
            return
        

        print("response = \(response)")

        let array = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray

        dispatch_async(dispatch_get_main_queue())  [unowned self] in
            self.values = array
            print ("error=\(self.values)")
            self.tableView?.reloadData();
        
    
    task.resume()

【问题讨论】:

我不明白。你想让我做什么 ?从你的关闭中取出“数据”?做什么? 所以我有一个全局变量 var values:NSArray = [] 我在这里从数据库中检索数据 let array = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 作为! NSArray ;我想将该全局变量的值设置为变量“数组”的值 您已经在使用 self.values = array 行进行此操作。你有什么问题? 它什么也不打印,因为您在网络调用完成之前打印它。联网需要时间,您的应用不想在此期间冻结,因此它会在后台执行,同时继续执行。 您不能将数据从闭包中传递出去,至少不能以有意义的方式传递。您需要根据以下答案将 completionHandler 传递给函数。在该 completionHandler 闭包中,您将使用已检索的值执行所需的任何任务。 【参考方案1】:

对闭包中的任何异步任务使用完成

func get(completion:(value: NSArray) -> Void)

    // request part
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
        data, response, error in
        // your serialization code

        dispatch_async(dispatch_get_main_queue())  [unowned self] in
            self.values = array

            // return value to completion
            completion(value: array)

            print ("error=\(self.values)")
            self.tableView?.reloadData();
        
    
 

更改在 viewdidload 中获取值的方式

   get(value) in
       // finish NSURLSession task and everything should be done in this closure
        self.values = value
        print ("values=\(self.values)")
    

【讨论】:

我试过这个,它给我一个错误“使用未解析的标识符“完成””行完成(值:数组) 你的函数参数添加了吗? 更新了我的 func 参数代码。现在应该没问题了 没有错误了,但是现在我如何使用传递给完成的数据来为我的全局变量“values”赋值? 所以我确实得到了 (value) in self.values = value 但它仍然没有将“values”的值更改为我想要的值

以上是关于快速从闭包中获取变量的值的主要内容,如果未能解决你的问题,请参考以下文章

阮一峰的网络日志有感

聊聊JavaScript-闭包

如何从转义闭包中获取值并将其分配给变量并在表格视图中显示

将值从闭包赋值给变量 Swift

深入理解javascript原型和闭包(14)——从自由变量到作用域链

php方法中如何获取闭包的值?