我正在尝试使用JSON
将SwiftyJSON
数据解析为一个数组,以便在我的TableView
中使用。但是,即使我可以成功请求数据并将其解析为数组,我也无法从getObjects
函数返回它,因为它是异步完成的。我曾尝试使用完成处理程序,并在完成几个教程后,似乎我遗漏了一些东西。
有人知道如何返回我在TableViewController
中使用的数组吗?
表视图控制器
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
}
}
答案 0 :(得分:1)
您需要使用completionHandler将数据返回到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)
可能有一些语法错误我没有测试它