2017-01-09 15 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) '!' forceはオプションのラップを解除します。これは慎重に使用する必要があります。たとえば、 'nil'値を持つオプションをアンラップすると、実行時にアプリケーションがクラッシュします。 –

+0

@EricAya、その情報をありがとうございます。私は初心者のSwift開発者なので、何か作業をしてそのサイトを見つけようとしていました。 – AETechAdm

+0

@ RyanH。コードを改善し、うまくいけば良いように改善するための素晴らしいフィードバックがあります。ありがとうございました – AETechAdm

答えて

1

あなたはresultオブジェクトから0番目のインデックス要素を参照しているとそれだけでJSONデータから第一のレコードを返します。ループを実行し、データを配列に追加する必要があります。この配列は、データを移入するためにUITableViewに追加する必要があります。

+0

Gurdev、あなたが言ったことは私がそれを機能させるために変更する必要があるものに慣れていないことです。それを修正する方法のコーディング例を提供できますか?私は迅速なプログラミングを理解しようとする最初の段階にあります。 – AETechAdm

+0

これを試してみましょう。もし結果がcu_listになったら?["Result"] as? [[String:任意]] { \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() 
    } 
}