快速从闭包中获取变量的值
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”的值更改为我想要的值以上是关于快速从闭包中获取变量的值的主要内容,如果未能解决你的问题,请参考以下文章