如何将服务器中的JSON数据放入Swift 3中的表格视图单元格
问题描述:
我试图将JSON数据从服务器显示到表格视图单元格中。我在捕获响应值时遇到了问题。如何获得jobTime.count并获得jobEndTime值?我想为每个单元格显示jobTime-jobEndTime。如何将服务器中的JSON数据放入Swift 3中的表格视图单元格
我想我必须声明一个自定义结构作业。但我不知道如何创建。
struct Job {
var jobDate: String
var jobEndTime: Int
var jobID: Int
var jobTime: Int
init(dict: [String:AnyObject]) {
self.jobDate = dict["jobDate"] as! String
self.jobEndTime = dict["jobEndTime"] as! Int
self.jobID = dict["jobID"] as! Int
self.jobTime = dict["jobTime"] as! Int
}
}
var jobs = [Job]()
override func viewDidLoad() {
super.viewDidLoad()
retrieveTime()
}
func retrieveTime(){
if let crew = user!["crew"] as? [String:Any], let crewID = crew["crew_id"] as? String{
let param = ["action": "retrieve time", "job": ["crew_id": crewID, "jobDate": passedData]] as [String : Any]
let headers = [
"content-type": "application/json",
"cache-control": "no-cache"
]
if let postData = (try? JSONSerialization.data(withJSONObject: param, options: [])) {
let request = NSMutableURLRequest(url: URL(string: "http://52.221.231.3/gv/app_api.php")!,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request as URLRequest) {
(data, response, error) -> Void in
DispatchQueue.main.async(execute: {
if let json = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? NSDictionary
{
let result = json["result"] as? String
if (result == "success") {
if let jsonData = json["jobs"] as? [[String:AnyObject]] {
self.jobs = jsonData.map { Job(dict: $0) }
}
print(self.jobs)
self.tableView.reloadData()
}
}else{
print(result!)
}
}
})
}
task.resume()
}
}
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return jobs.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "jobCell", for: indexPath)
let job = self.jobs[indexPath.row]
cell.textLabel?.text = job.jobDate
return cell
}
对不起乱码,这是我第一次在斯威夫特与JSON工作。
JSON Data :
{
jobs = (
{
jobDate = "2017-09-07";
jobEndTime = 1504749600;
jobID = 104;
jobTime = 1504746000;
},
{
jobDate = "2017-09-07";
jobEndTime = 1504756800;
jobID = 105;
jobTime = 1504753200;
}
);
message = "Retrieve Sucessfully";
result = success;
}
答
作为一个建议,Alamofire是用于发送网络请求一个良好的框架,并发现here。
另外,为了使用JSON,Swift不太好。你必须为它编写很多额外的代码。用于处理JSON的流行库称为SwiftyJSON,它非常适合Alamofire,它的发现号码为here。
这将允许你写像这样JSON响应请求:
Alamofire.request(url, method: .get).validate().responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
let name = json["name"].stringValue
let job = json["teacher"].stringValue
case .failure(let error):
print(error)
}
}
的SwiftyJSON自述文件包括通过JSON的结果,你需要做的如何环路信息。
+0
只需使用JSONSerialization。无需使用其他框架。它看起来很短,但是你没有做任何错误检查,并且没有在任何地方存储结果。 – gnasher729
你能告诉我们你的JSON输出吗? – Siyavash
首先,不要把你的tableview.reload()放在viewDidLoad中,放到你的URLSession回调函数里面,所有的进程都会在你接收到数据后运行。 –
好的,我更新了这个问题。 –