2016-05-25 26 views
0

所以我從一個json格式的url中獲取數據。我試圖在我的tableview中顯示數據,但即使感覺很簡單,我也無法弄清楚如何去做。如何使用json的mutablearray填充我的tableview

​​

我知道我已經做到了....我猜在viewDidLoad()我會打電話CompanyModel().getJSON()這將獲取數據,然後將其存儲在一個空數組心裏感覺空如何去做吧。

我不能聲明一個變量的NSarray,並將它的數據直接存儲到我的變量中,然後填充tableview。儘管如此,我希望這解釋了我想要達到的目標。

回答

0

那麼首先改變函數返回公司數組:

func getJSON() -> NSMutableArray { 

} 

通過的結束for循環返回公司陣列

for company in companies { 

} 

您的陣列填充後,返回內部數組此塊:

dispatch_async(dispatch_get_main_queue(), { 

    return companyArray 

}) 

而且task.resume()後返回arr AY:

return companyArray 

從任何你想去的調用這個類和獲取數組:

獲取類

Let companyModal = CompanyModel() 

而且在任何地方,你有你的表視圖和類咱們的參考在viewDidLoad中說,你應該先有NSMutableArray

var arraySource = NSMutableArray() 

而且在viewDidLoad

arraySource = companyModal.getJSON() 

直接反映的tableView的數據做:

Mytableview.reloadData() 
+0

正是我在後,但由於某種原因,我的'變種arraySource = NSMutableArray的()'是空的。如果我在'task.resume()'的同一個括號內打印(companyArray)',那麼'companyArray'是空的。儘管如此,如果我之前打印了一個支架,出於某種原因它會打印完整陣列。不知道爲什麼數組被刪除 – luke

+0

@luke嘗試在func getJSON之後定義你的數組:let companyArray:NSMutableArray = NSMutableArray()'我想這是因爲你的數組是在特定的括號中定義的,所以在編譯器完成該塊,它從內存中刪除所有的數組! – AaoIi

+0

我其實已經在我的代碼中做過 - 只是編輯了問題(我認爲這就是你的意思)。我還添加了print語句的作用和不起作用。 – luke

0

你不能異步網絡請求的封閉內使用return,你必須改用回調。

您從請求需要一個NSMutableArray的,所以首先,讓我們爲這個回調:

completion: (array: NSMutableArray)->() 

我們這個回調添加到方法簽名:

func getJSON(completion: (array: NSMutableArray)->()) 

然後在陣列將可用的位置,我們將此完成處理程序放置在:

class CompanyModel { 
    func getJSON(completion: (array: NSMutableArray)->()) { 
     let companyArray: NSMutableArray = NSMutableArray() 
     let requestURL: NSURL = NSURL(string: "http://localhost/Companies/JSON.php")! 
     let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
     let session = NSURLSession.sharedSession() 
     let task = session.dataTaskWithRequest(urlRequest) { 
      (data, response, error) -> Void in 
      let httpResponse = response as! NSHTTPURLResponse 
      let statusCode = httpResponse.statusCode 
      if (statusCode == 200) { 
       do{ 
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 
        if let companies = json["companies"] as? [[String: AnyObject]] { 
         for company in companies { 
          if let name = company["name"] as? String, 
           let phoneNumber = company["phone_number"] as? String, 
           let website = company["website"] as? String, 
           let email = company["email"] as? String, 
           let address = company["address"] as? String { 
           let company = CompanyModel() 
           company.name = name 
           company.phoneNumber = phoneNumber 
           company.website = website 
           company.email = email 
           company.address = address 
           companyArray.addObject(company) 
          } 
         } 

         // CALLBACK HERE 
         completion(array: companyArray) 

        } 
       } catch { 
        print("Error with Json: \(error)") 
       } 
      } 
     } 
     task.resume() 
    } 
} 

我們得到來自網絡的陣列我們使用尾隨封這樣的:

getJSON { (array) in 
    print(array) 
}