GET работает только один раз

#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 Не могли бы вы объяснить подробнее? Я был бы очень признателен!