2017-09-01 30 views
0

我试图将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; 
} 
+0

你能告诉我们你的JSON输出吗? – Siyavash

+0

首先,不要把你的tableview.reload()放在viewDidLoad中,放到你的URLSession回调函数里面,所有的进程都会在你接收到数据后运行。 –

+0

好的,我更新了这个问题。 –

回答

0

作为一个建议,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

相关问题