ios - 在 Swift 中解析 JSON 数据

标签 ios mysql json swift parsing

我正在尝试创建一个 IOS 应用程序,该应用程序从网站读取 MYSQL 数据并将其显示给用户。这是解析数据的文件:

import UIKit
protocol HomeModelDelegate{
func itemsDownloaded(bar_data:[DataModel])
}

class HomeModel: NSObject {
var delegate:HomeModelDelegate?
func getItems() {
    //Hit the web service Url
    let serviceUrl = "OMITTED"
    //Download the json data
    let url = URL(string: serviceUrl)
    if let url = url{
        //Create a URL Session
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url, completionHandler: {(data, response, error) in
            if error == nil {
                //Succeeded                 
                //Call the parse json function on the data
                self.parseJson(data!)
            }              
            else {
                //Error occured
            }                             
        })          
       // Start the task
        task.resume()
    }             
    //Notify the view controller and pass the data back
}
 //Parse it out into DataModel structs
func parseJson(_ data:Data){        
    var bardataarray = [DataModel]()        
        //parse the data into DataModel structs
    do{
   //parse the data into a json object
        let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as! [Any]
    //loop through each result in the json array
        for jsonResult in jsonArray {
            //Cast json result as a dictionary
            let jsonDict = jsonResult as! [String:String]
            //create new bar data and set its properties
            let bardata = DataModel(name: jsonDict["Bar Name"]!, cover: jsonDict["Bar Cover"]!, deals: jsonDict["Drink Deals"]!)
        //add it to the array
            bardataarray.append(bardata)           
        }
        //TODO Pass the location array back to delegate 
        delegate?.itemsDownloaded(bar_data: bardataarray)         
    }
    catch{
        print("There was an error")
    }         
}
                         //eof
}

这是数据模型文件:

import Foundation

struct DataModel {    
var name = ""
var cover = ""
var deals = ""
}

这是 View Controller :

import UIKit
class ViewController: UIViewController, 
HomeModelDelegate, UITextViewDelegate {  
var bar_info = [DataModel]()   
var homeModel = HomeModel()

@IBOutlet weak var LionCoverView: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    homeModel.getItems()
    homeModel.delegate = self
    updateCover()
}

func updateCover(){
    let size = bar_info.count
    print(size)  
}

func itemsDownloaded(bar_data: [DataModel]) {
    //adding files to array that we can work with

    self.bar_info = bar_data

    print(bar_data[2].name)
}

}

在 View Controller 中,我尝试将 DataModel 数组分配给我在函数 itemsdownloaded 的 View Controller 开头初始化的数组 bar_info,但值并未发送。有谁知道我做错了什么?我在下载到控制台的 items 中放置了一条打印语句,以确保 bar_data 中的值存在,并且当我运行它时,程序从网站生成正确的值,那么为什么这些变量一开始没有分配给 DataModel 数组 View Controller 的?

最佳答案

您可以使用 DispatchQueue.main.asynch 来处理 UI 更新,如下所示,您将对委托(delegate)的调用移出 parseJson 函数

let task = session.dataTask(with: url, completionHandler: {(data, response, error) in
    if error == nil {
        self.parseJson(data!)
        DispatchQueue.main.async {
            delegate?.itemsDownloaded(bar_data: bardataarray)     
        }
    }
}

关于ios - 在 Swift 中解析 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52977249/

相关文章:

cocoa - 从 MacOS 应用程序将文件写入 iOS 设备

ios - NSCalendar currentCalendar 不工作

java - 关于使用 Ebean 的 Play Framework 和 MySQL 的简单 CRUD 教程?

python - 使用 python 仅更新空 mysql 字段

java - 使用关系和 @JsonIdentityInfo 进行 JSON 序列化

java - 反序列化 Gson NullPointer?

ios - Google Analytics - 如何在 ios 中为事件发送多个维度

mysql - SQL-模式匹配无输出

javascript - 极其简单的HTML js代码,但是为什么不行呢?

ios - 使用 AFNetworking 在 IOS 应用程序中集成 SSL 证书