Swift 2 在 CompletionHandler 中调用函数
Swift 2 Call Function in CompletionHandler
我是 Swift 的新人。使用 NSURLSession
从服务器下载 JSON 数据后,我无法立即调用函数。这是我的代码 -
func loadTableViewWithServerData(_url:String){
showOverLayView()
let postEndpoint: String = _url
let session = NSURLSession.sharedSession()
let url = NSURL(string: postEndpoint)!
session.dataTaskWithURL(url, completionHandler: {
(data, response, error) in
guard let responseData = data else {
print("Error: did not receive data")
return
}
let post: NSMutableArray
do {
post = try NSJSONSerialization.JSONObjectWithData(responseData,
options: []) as! NSMutableArray
self.dataArray = SHDataAccess().arrayFromPlist(post)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.questionTableView.reloadData()
//hideOverLayView() /* it shows error here*/
})
} catch {
print("error trying to convert data to JSON")
}
}).resume()
}
当我尝试调用 hideOverLayView() /* it shows error here*/
时,它显示错误:
Error : Call to method 'hideOverLayView()' in closure requires explicit 'self' to make capture semantics explicit.
我该如何解决这个问题?或者调用另一个函数的正确方法是什么,我在服务器数据可用时刷新我的视图。
这是我的 hideOverLayView() /* it shows error here*/
函数 -
func hideOverLayView(){
self.overLayView.imageProgress.stopAnimating()
UIView.animateWithDuration(0.5, animations: {
self.overLayView.hidden = true
})
}
当您处于闭包中时,您需要使用 self
显式调用 class 方法。如果没有 self
,您的方法的上下文不明确。
在 dispatch_async
块内将 hideOverLayView()
更改为 self.hideOverLayView()
。
您可以尝试 self?.hideOverLayView()
来避免警告。
您可以做的另一件事是在闭包的开头添加 [weak self]
以使 self 变弱。
我是 Swift 的新人。使用 NSURLSession
从服务器下载 JSON 数据后,我无法立即调用函数。这是我的代码 -
func loadTableViewWithServerData(_url:String){
showOverLayView()
let postEndpoint: String = _url
let session = NSURLSession.sharedSession()
let url = NSURL(string: postEndpoint)!
session.dataTaskWithURL(url, completionHandler: {
(data, response, error) in
guard let responseData = data else {
print("Error: did not receive data")
return
}
let post: NSMutableArray
do {
post = try NSJSONSerialization.JSONObjectWithData(responseData,
options: []) as! NSMutableArray
self.dataArray = SHDataAccess().arrayFromPlist(post)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.questionTableView.reloadData()
//hideOverLayView() /* it shows error here*/
})
} catch {
print("error trying to convert data to JSON")
}
}).resume()
}
当我尝试调用 hideOverLayView() /* it shows error here*/
时,它显示错误:
Error : Call to method 'hideOverLayView()' in closure requires explicit 'self' to make capture semantics explicit.
我该如何解决这个问题?或者调用另一个函数的正确方法是什么,我在服务器数据可用时刷新我的视图。
这是我的 hideOverLayView() /* it shows error here*/
函数 -
func hideOverLayView(){
self.overLayView.imageProgress.stopAnimating()
UIView.animateWithDuration(0.5, animations: {
self.overLayView.hidden = true
})
}
当您处于闭包中时,您需要使用 self
显式调用 class 方法。如果没有 self
,您的方法的上下文不明确。
在 dispatch_async
块内将 hideOverLayView()
更改为 self.hideOverLayView()
。
您可以尝试 self?.hideOverLayView()
来避免警告。
您可以做的另一件事是在闭包的开头添加 [weak self]
以使 self 变弱。