如何使用来自 json 的 mutablearray 填充我的 tableview
Posted
技术标签:
【中文标题】如何使用来自 json 的 mutablearray 填充我的 tableview【英文标题】:How to populate my tableview with a mutablearray from json 【发布时间】:2016-05-25 18:32:59 【问题描述】:所以我从 json 格式的 url 获取数据。我正在尝试在我的 tableview 中显示数据,但即使感觉很简单,我也不知道该怎么做。
class CompanyModel
func getJSON()
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)
print("Everyone is fine, file downloaded successfully.")
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)
print(companyArray)
catch
print("Error with Json: \(error)")
print(companyArray) <- array is populated
print(companyArray) <- array is empty
task.resume()
我知道我以前做过....我猜在viewDidLoad()
我会打电话给CompanyModel().getJSON()
它将获取数据,然后将其存储在一个空数组中,但我的大脑对如何处理感到茫然去做吧。
我无法声明 NSarray 的变量并将其数据直接存储为变量,然后填充 tableview。不过,我希望这能解释我想要实现的目标。
【问题讨论】:
【参考方案1】:首先更改函数以返回您的公司数组:
func getJSON() -> NSMutableArray
在for循环结束时返回公司数组
for company in companies
填充数组后,返回此块内的数组:
dispatch_async(dispatch_get_main_queue(),
return companyArray
)
在task.resume()
之后返回数组:
return companyArray
从任何你想调用这个类并获取数组的地方:
获取类的引用
Let companyModal = CompanyModel()
在任何你有你的表格视图和类的地方,比如说viewDidLoad
,你应该首先有NSMutableArray
。
var arraySource = NSMutableArray()
在viewDidLoad
:
arraySource = companyModal.getJSON()
并在 tableView 中显示数据:
Mytableview.reloadData()
【讨论】:
正是我所追求的,但由于某种原因,我的var arraySource = NSMutableArray()
是空的。如果我在与task.resume()
相同的括号内执行print(companyArray)
,则companyArray
为空。不过,如果我之前打印一个括号,它会出于某种原因打印整个数组。不知道为什么删除数组
@luke 尝试在 func getJSON 之后定义您的数组:let companyArray: NSMutableArray = NSMutableArray()
我认为这是因为您的数组是在特定的括号中定义的,因此在编译器完成该块执行后,它会从记忆!
我实际上已经在我的代码中做了 - 只是编辑了问题(我认为这就是你的意思)。我还添加了 print 语句起作用和不起作用的位置。
@luke 好!只需在填充了所有数据后立即返回数组!这就是你所需要的!
我无法返回填充它的数组,因为我得到一个编译器错误,只有当它没有填充时【参考方案2】:
您不能在异步网络请求的闭包中使用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)
【讨论】:
以上是关于如何使用来自 json 的 mutablearray 填充我的 tableview的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jsonDecoder 处理来自 JSON 响应的动态键?
如何使用 normalizr 规范化来自 JSON 的数据?