Skip to content

Instantly share code, notes, and snippets.

@OctoberHammer
Created May 7, 2017 18:28
Show Gist options
  • Save OctoberHammer/bda61d021af6c6e3b2658779e3700692 to your computer and use it in GitHub Desktop.
Save OctoberHammer/bda61d021af6c6e3b2658779e3700692 to your computer and use it in GitHub Desktop.
Твой текст
//Сначала вьюКонтроллер
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")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment