2017-01-09 38 views
2

嘗試將我們的Web服務讀入UITableViewController,它只將第一條記錄返回給模擬器。所以希望有人能夠看到代碼並引導我走上正確的道路。最終目標是將其放入UITableViewCell中,這樣我就可以很好地格式化,但只是想要獲取所有記錄。Swift 3.0和web服務

以下是將返回的部分json文件的視圖。

{ 
"Count":11518, 
"Result":[ 
    { 
    "cuName": "#1", 
    "charter_Num": 
    "16328","City": 
    "Jonesboro", 
    "State_id": "GA", 
    "cuName_location": "#1 - Jonesboro, GA" 
    }, 
    { 
    "cuName": "@lantec Financial", 
    "charter_Num": "7965", 
    "City": "Virginia Beach", 
    "State_id": "VA", 
    "cuName_location": "@lantec Financial - Virginia Beach, VA" 
    }] 
} 

這是讀取json web服務並嘗試解析並放入表中的代碼。

func get_data_from_url(_ link:String) 
    { 
    let url:URL = URL(string: link)! 
    let session = URLSession.shared 

    let request = NSMutableURLRequest(url: url) 
    request.httpMethod = "GET" 
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 


    let task = session.dataTask(with: request as URLRequest, completionHandler: { 
     (
     data, response, error) in 

     guard let _:Data = data, let _:URLResponse = response , error == nil else { 
      return 
     } 


     self.extract_json(data!) 
    }) 

    task.resume() 
} 


func extract_json(_ data: Data) 
{ 
    let json: Any? 

    do 
    { 
     json = try JSONSerialization.jsonObject(with: data, options: []) 
    } 
    catch 
    { 
     return 
    } 

    //Commented out the following lines because it doesn't return anything when using the modified code that works 
    // 
    //  guard let data_list = json as? NSArray else 
    //  { 
    //   return 
    //  } 

    //This code works but only gives me the 1st record back 
    if let cu_list = try? json as? [String:Any], 
     let result = cu_list?["Result"] as? [[String:Any]], 
     let charter_num = result[0]["charter_Num"] as? String, 
     let value = result[0]["cuName_location"] as? String, result.count > 0 { 
     TableData.append(value + " (" + charter_num + ")") 
    } else { 
     print("bad json - do some recovery") 
    } 

    DispatchQueue.main.async(execute: {self.do_table_refresh()}) 

} 
+1

建議:(1)不要在Swift中使用'snake_case'作爲方法和變量名稱。相反,你應該使用較低的'camelCase'。 (2)如果類型可以很容易推斷出來,你不需要指定類型。 (3)大括號應與聲明或聲明內聯,而不是放在新行上。 (4)'''武力打開一個可選項。這應該明智地使用,就好像你試圖強制解包一個具有'nil'值的可選項,你的應用程序會在運行時崩潰。 –

+0

@EricAya,謝謝你的信息。我是一名初學Swift開發人員,所以我試圖找到一些工作,並找到該網站。 – AETechAdm

+0

@RyanH。對我可以對代碼進行的改進提供了很好的反饋,讓它能夠更好地閱讀並希望更好地響應。謝謝 – AETechAdm

回答

1

你是指從result對象第0指數元素,它將只返回JSON數據的第一個記錄。您需要運行循環並將數據追加到您需要用於填充UITableView中的數據的數組。

+0

Gurdev,你所說的話是有道理的,我不熟悉我需要改變以使其工作。你能提供一個如何解決它的代碼示例嗎?我正處於試圖快速編程的初始階段。 – AETechAdm

+0

試試這個'if let result = cu_list?[「Result」] as? [[String:Any]] { \t var i = 0; \t for(i = 0; i

-1
func GetCategoryData(){ 
    //get_high_score.php?from=1472409001482&number=10&to=1493657787867 
    let checklaun = UserDefaults.standard.integer(forKey: "Language") 
    if checklaun == 1 { 

     EZLoadingActivity.show("Loading...", disableUI: false) 

    }else{ 
     EZLoadingActivity.show("جار التحميل...", disableUI: false) 

    } 


    DispatchQueue.global(qos: .background).async { 

     let myUrl = URL(string: GlobleUrl.BASEURL + "advertise_list.php"); 
     var request = URLRequest(url:myUrl!) 
     request.httpMethod = "GET" 

     // let fromvalue = 1472409001482 
     // let numbervalue = 10 
     // let tovalue = 1493657787867 
     let postString = ""//"from=" + fromvalue + "&" + "number=" + numbervalue + "&" + "to=" + tovalue 

     request.httpBody = postString.data(using: String.Encoding.utf8); 
     let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 

      if error != nil 
      { 
       EZLoadingActivity.hide(false, animated: true) 
       print("error=\(error)") 
       let checklaun = UserDefaults.standard.integer(forKey: "Language") 
       var titlemsga : String = String() 
       var okmsg : String = String() 
       if checklaun == 1 { 
        titlemsga = "Something going wrong" 
        okmsg = "Ok" 
       }else{ 
        titlemsga = "حدث خطأ ما" 
        okmsg = "حسنا" 
       } 

       let alert = UIAlertController(title: "", message: titlemsga, preferredStyle: UIAlertControllerStyle.alert) 
       alert.addAction(UIAlertAction(title: okmsg, style: UIAlertActionStyle.default, handler: nil)) 
       self.present(alert, animated: true, completion: nil) 

       return 
      } 


      print("response = \(response)") 


      do { 

       let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

       DispatchQueue.main.async { 

        if let parseJSON = json { 

         print(parseJSON) 
         let status = parseJSON["status"] as! Bool 

         if status == true{ 

          EZLoadingActivity.hide(true, animated: false) 

          self.categoryDataArray = parseJSON["data"] as! NSMutableArray 
          print("\(self.categoryDataArray)") 

          self.filterarray = parseJSON["fixed_cat"] as! NSMutableArray 

          let teamp = self.categoryDataArray .value(forKey: "main_image") as AnyObject 
          print("\(teamp)") 
          self.categoryImageArray.setArray(teamp as! [Any]) 
          print("\(self.categoryImageArray)") 

          // let teamp = self.data .value(forKey: "name") as AnyObject 
          // print("\(teamp)") 
          // self.categoryNameArray.setArray(teamp as! [Any]) 


          self.allcategoryTableViewCell.reloadData() 
          self.allcategoryfilterlistview.reloadData() 
          // self.tblscoreList.reloadData() 

         }else{ 
          EZLoadingActivity.hide(false, animated: true) 
         } 

        } 
       } 
      } 
      catch { 
       EZLoadingActivity.hide(false, animated: true) 
       let checklaun = UserDefaults.standard.integer(forKey: "Language") 
       var titlemsga : String = String() 
       var okmsg : String = String() 
       if checklaun == 1 { 
        titlemsga = "Something going wrong" 
        okmsg = "Ok" 
       }else{ 
        titlemsga = "حدث خطأ ما" 
        okmsg = "حسنا" 
       } 

       let alert = UIAlertController(title: "", message: titlemsga, preferredStyle:  UIAlertControllerStyle.alert) 
       alert.addAction(UIAlertAction(title: okmsg, style: UIAlertActionStyle.default, handler: nil)) 
       self.present(alert, animated: true, completion: nil) 
       print(error) 
      } 
     } 
     task.resume() 
    } 
}