GET只能使用一次

时间:2016-10-07 00:49:07

标签: json swift get

我是iOS编程的新手,所以我的问题可能并不复杂,但我仍然在努力寻找最佳解决方案。任何帮助将受到高度赞赏!

每次用户打开应用时,我都会尝试发送GET请求。我编写了函数loadMenu(),它从服务器上的json文件中收集数据,并在应用程序中填充表。

问题是,如果我更新json文件,它不会反映在应用程序中。如果感觉像loadMenu()部分代码被忽略了。

这是我的代码:

导入UIKit

class 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
}   

2 个答案:

答案 0 :(得分:1)

@ david是对的,如果您将loadMenu()方法放在viewDidAppear()中,则每次出现视图时都会调用它。您可以详细了解UIViewController here

的各个生命周期阶段

另一件事。我不清楚您是否每次都调用loadMenu(),或者您是否只是没有看到更新的内容。

我可以看到,在更新JSON时,您没有重新加载表视图。因此,您的TableView不知道发生了任何更新,也不会再次呈现,您将看不到任何更新。

因此,就在这一行之后:

 NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1")

你应该告诉你的tableView像这样重新加载:

tableView.reloadData()

所以你有:

NSUserDefaults.standardUserDefaults().setObject(self.names, forKey: "test1")
tableView.reloadData()

这应该会导致所有“渲染TableView”方法再次被调用,但这次使用新数据,您应该看到更新的内容。

希望这会对你有所帮助。

答案 1 :(得分:0)

如果您在loadMenu()而不是viewDidAppear(animated:)中致电viewDidLoad(),则每次您离开应用并重新开启时都会调用它。