Created
May 7, 2017 18:28
-
-
Save OctoberHammer/bda61d021af6c6e3b2658779e3700692 to your computer and use it in GitHub Desktop.
Твой текст
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Сначала вьюКонтроллер | |
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