如何使用来自 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 的数据?

如何使用 Jackson 反序列化来自 json 对象的对象数组

如何在 JSON Schema 中使用来自外部文件的定义?

如何使用来自 AJAX 调用的 JSON 数据构建表?

如何使用来自 json 的 mutablearray 填充我的 tableview