Разбор данных JSON в Swift - PullRequest
       5

Разбор данных JSON в Swift

0 голосов
/ 24 октября 2018

Я пытаюсь создать приложение 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
}

Вот файл DataModel:

import Foundation

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

Вот контроллер представления:

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)
}

}

ВВ контроллере представления я пытаюсь присвоить массив DataModels массиву bar_info, который я инициализировал в начале контроллера представления в загруженных элементах функции, но значения не отправляются.Кто-нибудь знает, что я делаю не так?Я поместил оператор print в items, загруженный на консоль, чтобы убедиться, что значения в bar_data существуют, и когда я его запускаю, программа выдает правильное значение с веб-сайта, так почему эти переменные не присваиваются массиву DataModel в начале?контроллера вида?

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать DispatchQueue.main.asynch для обработки обновлений пользовательского интерфейса, как показано ниже, где вы перемещаете вызов делегату из parseJson func

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)     
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...