在 Swift 上访问变量 do-catch 语句
Access variable do-catch statement on Swift
我正在开发一个 json 解析的应用程序。我正在为 json 消息使用 AlertView。但是我无法访问 AlertView 中的 jsonmessage 变量。如果我将 AlertView 放入 DO 中,我会收到此错误:“libc++abi.dylib:终止并出现 NSException 类型的未捕获异常
(LLDB)”
对不起,我的英语不好。这是我的代码:
request.httpBody = postParameters.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
if error != nil{
print("error is \(String(describing: error))")
return;
}
do {
let myJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = myJSON {
var jsonmessage : String!
jsonmessage = parseJSON["message"] as! String?
print(jsonmessage)
}
} catch {
}
}
task.resume()
let alert = UIAlertController(title: "Alert", message: jsonmessage /*not accessible*/ , preferredStyle: .alert)
alert.addAction(UIAlertAction(title:"Ok", style:UIAlertActionStyle.default, handler:{ (UIAlertAction) in
_ = self.navigationController?.popToRootViewController(animated: true)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
}))
self.present(alert, animated: true, completion: nil)
首先,您正在执行异步请求。一旦您收到响应,jsonmessage 变量就会被设置。但是您在此之前创建了 UIAlertController。我猜您希望在收到回复后显示提醒?
此外,您不能在其范围之外访问 jsonmessage 变量。要解决此问题,请移动 var jsonmessage : String!
使其与 UIAlertController 属于同一范围。
您应该可以将警报移到 do catch 语句中,但必须确保警报显示在主线程上。
如您所见,无法从您尝试访问它的位置访问 jsonMessage。
这是因为以下几个原因:
该请求是一个在后台运行的异步任务,需要一些时间才能完成。所以警报视图代码实际上在 jsonMessage 之前运行 returned
变量 jsonMessage 也超出了您尝试调用它的范围。
帮忙解释一下:
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
let fakeMessage = "hi"
// data, response, error and fakeMessage only exist here upto the closing bracket.
}
task.resume()
// fakeMessage doesn't exist here at all.
要解决您的问题,您可以在闭包内(我放置 fakeMessage 的地方)显示警报,或者在 return jsonMessage 准备就绪时为它设置一个 completionHandler,然后显示警报。
方法一
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
if error != nil{
print("error is \(String(describing: error))")
return;
}
do {
let myJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = myJSON {
var jsonmessage : String!
jsonmessage = parseJSON["message"] as! String?
DispatchQueue.main.async {
// some helper function to show a basic alert
self.presentAlert(title: "Response", message: jsonMessage)
}
}
} catch {
}
}
task.resume()
方法二
func fetchSomething(completion: @escaping (String -> Void)?) {
// setup request
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
let fakeMessage = "hi"
completion(fakeMessage)
}
task.resume()
}
那你就可以这样用了
self.fetchSomething { response in
DispatchQueue.main.async {
// some helper function to show a basic alert
self.presentAlert(title: "Response", message: jsonMessage)
}
}
我正在开发一个 json 解析的应用程序。我正在为 json 消息使用 AlertView。但是我无法访问 AlertView 中的 jsonmessage 变量。如果我将 AlertView 放入 DO 中,我会收到此错误:“libc++abi.dylib:终止并出现 NSException 类型的未捕获异常 (LLDB)” 对不起,我的英语不好。这是我的代码:
request.httpBody = postParameters.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
if error != nil{
print("error is \(String(describing: error))")
return;
}
do {
let myJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = myJSON {
var jsonmessage : String!
jsonmessage = parseJSON["message"] as! String?
print(jsonmessage)
}
} catch {
}
}
task.resume()
let alert = UIAlertController(title: "Alert", message: jsonmessage /*not accessible*/ , preferredStyle: .alert)
alert.addAction(UIAlertAction(title:"Ok", style:UIAlertActionStyle.default, handler:{ (UIAlertAction) in
_ = self.navigationController?.popToRootViewController(animated: true)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
}))
self.present(alert, animated: true, completion: nil)
首先,您正在执行异步请求。一旦您收到响应,jsonmessage 变量就会被设置。但是您在此之前创建了 UIAlertController。我猜您希望在收到回复后显示提醒?
此外,您不能在其范围之外访问 jsonmessage 变量。要解决此问题,请移动 var jsonmessage : String!
使其与 UIAlertController 属于同一范围。
您应该可以将警报移到 do catch 语句中,但必须确保警报显示在主线程上。
如您所见,无法从您尝试访问它的位置访问 jsonMessage。
这是因为以下几个原因:
该请求是一个在后台运行的异步任务,需要一些时间才能完成。所以警报视图代码实际上在 jsonMessage 之前运行 returned
变量 jsonMessage 也超出了您尝试调用它的范围。
帮忙解释一下:
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
let fakeMessage = "hi"
// data, response, error and fakeMessage only exist here upto the closing bracket.
}
task.resume()
// fakeMessage doesn't exist here at all.
要解决您的问题,您可以在闭包内(我放置 fakeMessage 的地方)显示警报,或者在 return jsonMessage 准备就绪时为它设置一个 completionHandler,然后显示警报。
方法一
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
if error != nil{
print("error is \(String(describing: error))")
return;
}
do {
let myJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = myJSON {
var jsonmessage : String!
jsonmessage = parseJSON["message"] as! String?
DispatchQueue.main.async {
// some helper function to show a basic alert
self.presentAlert(title: "Response", message: jsonMessage)
}
}
} catch {
}
}
task.resume()
方法二
func fetchSomething(completion: @escaping (String -> Void)?) {
// setup request
let task = URLSession.shared.dataTask(with:request as URLRequest){
data, response, error in
let fakeMessage = "hi"
completion(fakeMessage)
}
task.resume()
}
那你就可以这样用了
self.fetchSomething { response in
DispatchQueue.main.async {
// some helper function to show a basic alert
self.presentAlert(title: "Response", message: jsonMessage)
}
}