OctoberHammer
5/7/2017 - 6:28 PM

Твой текст

Твой текст

//Сначала вьюКонтроллер

import UIKit

//объявляем протокол
protocol HavingMenuItems {
  //пишу прямо в текстовом редакторе, могут быть ошибки, исправим
  //твой протокол - это просто класс, у которого будет вот такая переменная такого типа
  var menuItems: [MenuItem] {
    get {}
    set {}
  }

}


class ResultTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, XMLParserDelegate, HavingMenuItems{//твой вьюКонтроллер будет конформен этому прогтоколу

    var menuItems = [MenuItem]()//вот наша переменная из протокола
  {
  	didSet {//Как только из нашего метода, парсящего джейсон мы получаем заполненный массив, мы релоадим данные для того чтобы отобразить табличку визуально
    	Dispatch.main.async{
        	self.tableView.reloadData()
        }
    }
  }
  
    var reverseMenuItem = [MenuItem]()
    var json: [String:AnyObject] = [:]
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        prepereDataForCell()
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        
        cell.textLabel?.numberOfLines = 0
        
      
       // cell.textLabel?.text = "Item: \(menuItem[indexPath.row].name) " + " Price: \(menuItem[indexPath.row].price) " + "\n" + " Quantity: \(menuItem[indexPath.row].quantity) "// + " Sum:\(Double(menuItem[indexPath.row].price) * Double(menuItem[indexPath.row].quantity) ) "
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }
    
    
    
    func prepereDataForCell() {
        let nsStringQrData = NSString(string: "\(qrData!)")
        let qrDataLikeNsData: NSData = nsStringQrData.data(using: String.Encoding.utf8.rawValue)! as NSData

        let typeOfData = defineDataType()
        
        switch typeOfData {
        case "JSON":
            print(nsStringQrData)
            menuItem =  parceJsonData(data: qrDataLikeNsData)
            break
        case "XML":
            print(nsStringQrData)
            menuItem = xmlParce(sourceString: "\(nsStringQrData)")
            break
        case "https_XML":
            print("xml vs https parsing")
            menuItem = getJsonAndParceFromHttps(sourceString: "\(qrData!)", self)//в вызов метода передаем себя, чтобы метод заполнил нам меню
            break
        case "https_JSON":
            menuItem = getJsonAndParceFromHttps(sourceString: "\(qrData!)", self)//в вызов метода передаем себя, чтобы метод заполнил нам меню
            for i in menuItem {
                print(i.name)
                print(i.price)
                print(i.quantity)
            }
            print("Json vs https parsing")
            break
        default:
            print("Ololo")
        }
        
  
    }
    

}



//=========
// Ниже - модельный методы, который получает данные, парсит, заполняет массив
//=========









func getJsonAndParceFromHttps(sourceString: String, delegate: HavingMenuItems)  //Возвращаемый тип -Тут должен быть войд, потому что если в методе есть асинхронные вызовы, из которых ты собираешься коллекционировать свой массив, то из твоей процедуры управление вернется быстрее, чем ты наполнишь твой результирующий массив

//Также мы передаем в него сылку на протокол, которому вьюКонтроллер. На самом деле 

{
    //print(sourceString)


    tempMenuItems = [MenuItem]
    let url = URL(string: sourceString)
    URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
        guard let data = data, error == nil else { return }
        
        do {
            let jsonResult = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
            print("jsonResult")
            let jsonMenu = jsonResult?.allValues as! [NSDictionary]
            print("jsonMenu")
            for (index, jsonItem) in jsonMenu.enumerated() {
                let item = MenuItem()
                item.name = jsonItem["name"] as! String
                //print(item.name)
                item.price = jsonItem["price"] as! Double
                //print(item.name)

                item.quantity = jsonItem["quantity"] as! Int
                //print(item.name)
                tempMenuItems.append(item)
                if index == jsonMenu.count-1 {
                  //все, последний пункт меню добавлен, можем выходить
                	 delegate.menuItems = tempMenuItems
                }
                
            }
            //return currentMenuItem
            
        } catch let error as NSError {
            print(error)
            print("errrrrrr")
        }
    }).resume()

    print("Json_https was parsed")
 
}