使用 SwiftyJSON 处理 Alamofire 异步请求
Handle Alamofire asynchronous request using SwiftyJSON
我正在尝试使用 SwiftyJSON
将 JSON
数据解析为数组以用于我的 TableView
。但是,即使我可以成功请求数据并将其解析为数组,我也无法从 getObjects
函数中 return 它,因为它是异步完成的。我曾尝试使用完成处理程序,在学习了几个教程之后,我似乎遗漏了一些东西。
有人知道我如何 return 在我的 TableViewController
中使用数组吗?
Table 视图控制器
let objects = [Objects]()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let urlString = "URLSTRING"
objects = dataManager.getObjects(urlString)
print("objects in view controller products array \(objects.count)")
self.tableView.reloadData
}
请求函数
class DataManager {
func requestObjects(_ stringUrl: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) {
print("Request Data")
Alamofire.request(stringUrl, method: .get).validate().responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
print("responce success")
success(json)
case .failure(let error):
print(error)
} //End of switch statement
} //End of alamofire request
} //End of request function
func getObjects(_ urlString:String) -> [Object] {
var objects = [Object]()
requestObjects(urlString, success: { (JSONResponse) -> Void in
let json = JSONResponse
for item in json["items"] {
let title = item.1["title"].string
objects.append(Object(title: title!))
}
print("Number of objects = \(objects.count)")
}) {
(error) -> Void in
print(error)
}
print(objects) // Prints empty array
return objects // Array is empty
}
}
您需要使用 completionHandler 来 return 数据到 TableViewController。
func getObjects(completionHandler : @escaping ([Object]) -> (),_ urlString:String) -> [Sneaker] {
var objects = [Object]()
requestObjects(urlString, success: { (JSONResponse) -> Void in
let json = JSONResponse
for item in json["items"] {
let title = item.1["title"].string
objects.append(Object(title: title!))
}
completionHandler(objects)
print("Number of objects = \(objects.count)")
}) {
(error) -> Void in
print(error)
}
print(objects) // Prints empty array
return objects // Array is empty
}
}
在你的 TableViewController 中
dataManager.getObject(completionHandler: { list in
self.objects = list
}, urlString)
可能有一些语法错误我没有测试
我正在尝试使用 SwiftyJSON
将 JSON
数据解析为数组以用于我的 TableView
。但是,即使我可以成功请求数据并将其解析为数组,我也无法从 getObjects
函数中 return 它,因为它是异步完成的。我曾尝试使用完成处理程序,在学习了几个教程之后,我似乎遗漏了一些东西。
有人知道我如何 return 在我的 TableViewController
中使用数组吗?
Table 视图控制器
let objects = [Objects]()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let urlString = "URLSTRING"
objects = dataManager.getObjects(urlString)
print("objects in view controller products array \(objects.count)")
self.tableView.reloadData
}
请求函数
class DataManager {
func requestObjects(_ stringUrl: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) {
print("Request Data")
Alamofire.request(stringUrl, method: .get).validate().responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
print("responce success")
success(json)
case .failure(let error):
print(error)
} //End of switch statement
} //End of alamofire request
} //End of request function
func getObjects(_ urlString:String) -> [Object] {
var objects = [Object]()
requestObjects(urlString, success: { (JSONResponse) -> Void in
let json = JSONResponse
for item in json["items"] {
let title = item.1["title"].string
objects.append(Object(title: title!))
}
print("Number of objects = \(objects.count)")
}) {
(error) -> Void in
print(error)
}
print(objects) // Prints empty array
return objects // Array is empty
}
}
您需要使用 completionHandler 来 return 数据到 TableViewController。
func getObjects(completionHandler : @escaping ([Object]) -> (),_ urlString:String) -> [Sneaker] {
var objects = [Object]()
requestObjects(urlString, success: { (JSONResponse) -> Void in
let json = JSONResponse
for item in json["items"] {
let title = item.1["title"].string
objects.append(Object(title: title!))
}
completionHandler(objects)
print("Number of objects = \(objects.count)")
}) {
(error) -> Void in
print(error)
}
print(objects) // Prints empty array
return objects // Array is empty
}
}
在你的 TableViewController 中
dataManager.getObject(completionHandler: { list in
self.objects = list
}, urlString)
可能有一些语法错误我没有测试