#json #swift #get
#json #swift #получить
Вопрос:
Я новичок в программировании на iOS, поэтому мой вопрос может быть несложным, но я все еще пытаюсь найти лучшее решение. Любая помощь будет высоко оценена!
Я пытаюсь отправлять запрос GET каждый раз, когда пользователь открывает приложение. Я написал функцию loadMenu(), которая собирает данные из файла json на сервере и заполняет таблицу в приложении.
Проблема в том, что если я обновляю файл json, это не отражается в приложении. Если кажется, что часть кода loadMenu() просто игнорируется.
Вот мой код:
импорт UIKit
класс TableViewControllerNew: UITableViewController {
var names = [String]()
var mealDescription = [String]()
var price = [Double]()
override func viewDidLoad() {
super.viewDidLoad()
loadMenu()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
var new = NSUserDefaults.standardUserDefaults().objectForKey("names") as! [String]
print("test: (new.count)")
return new.count
}
func loadMenu() {
print("viewDidLoad works")
// Send HTTP GET
let myUrl = NSURL(string: "http://localhost/myPi/selection/wheyStationSelection.json");
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "GET";
NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
dispatch_async(dispatch_get_main_queue()) {
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
if let meals = json["meals"] as? [[String: AnyObject]] {
for meal in meals {
if let name = meal["name"] as? String {
self.names.append(name)
//NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1") as! [String]
//var new = NSUserDefaults.standardUserDefaults().objectForKey("test1") as? [String]
//print(new)
}
if let mealDescription = meal["mealDescription"] as? String {
self.mealDescription.append(mealDescription)
}
if let price = meal["price"] as? Double {
self.price.append(price)
}
}
}
} catch {
print("error serializing JSON: (error)")
}
NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1") as! [String]
//print(self.names)
//print(self.mealDescription)
//print(self.price)
}
}).resume()
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdenifier = "MealTableViewCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdenifier, forIndexPath: indexPath) as! MealTableViewCell
var new = NSUserDefaults.standardUserDefaults().objectForKey("names") as! [String]
let name = new[indexPath.row]
//print(name)
cell.mealNameLabel.text = name
return cell
}
Ответ №1:
@david прав, если вы поместите свой loadMenu()
метод в viewDidAppear()
него, он будет вызываться каждый раз, когда появляется ваше представление. Вы можете прочитать больше о различных этапах жизненного цикла a UIViewController
здесь
Еще одна вещь. Мне не ясно, вызывается ли ваш loadMenu()
не каждый раз или вы просто не видите обновленное содержимое.
Я вижу, что вы не перезагружаете свое табличное представление, когда JSON был обновлен. Поэтому вы TableView
не знаете, что произошли какие-либо обновления, и больше не будете отображаться, и вы не увидите никаких обновлений.
Поэтому сразу после этой строки:
NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1")
Вы должны указать вашему TableView перезагрузить себя следующим образом:
tableView.reloadData()
Итак, у вас есть:
NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1")
tableView.reloadData()
Это должно привести к повторному вызову всех ваших методов «render the TableView», но на этот раз с новыми данными, и вы должны увидеть обновленный контент.
Надеюсь, это вам поможет.
Ответ №2:
Если вы вызываете loadMenu()
viewDidAppear(animated:)
вместо viewDidLoad()
, то он будет вызываться каждый раз, когда вы покидаете свое приложение и снова открываете его.
Комментарии:
1. Разве этот метод не должен использоваться в одном из методов AppDelegate?
2. @James Не могли бы вы объяснить подробнее? Я был бы очень признателен!