【问题标题】:Loading data from API pattern issue从 API 模式问题加载数据
【发布时间】:2016-10-05 10:38:08
【问题描述】:

我正在构建一个在collectionView 中填充数据的应用程序。数据来自 API 调用。当屏幕首次加载时,我获取产品并将它们本地存储在我的 ViewController 中。

我的问题是我应该什么时候再次获得产品以及如何处理换屏。我的数据会在应用程序运行时发生变化(价格等敏感属性),但我没有找到理想的解决方案来每次调用 viewWillAppear 时都进行 API 调用。

谁能告诉我处理这种情况的最佳模式是什么。我的第一个想法是检查[CustomObject].isEmpty 是否在viewWillAppear 上,然后拨打电话。例如,包括一个每隔 10-15 分钟检查一次的计时器。

感谢您的意见。

【问题讨论】:

    标签: ios objective-c swift uicollectionview viewwillappear


    【解决方案1】:

    我不确定数据是什么样子以及您的 API 是如何工作的,但是当您的 API 更新数据时,您当然不必调用 viewWillAppear

    当您的数据更新时,有两种可能的解决方案会收到通知。 您可以使用通知让您知道 API 是否提供了一些数据。提供数据后,您的通知将调用以更新集合视图。您还可以在包含来自 API 的数据的对象或结构中包含“didSet”调用。每次更新对象或结构时,都会调用 didSet 例程来更新您的集合视图。

    要更新您的集合视图,您只需调用方法reloadData(),集合视图将自行更新并查询现在包含从您的 API 新接收的数据的数据源。

    希望这会有所帮助。

    【讨论】:

    • 我可以更新数据并重新加载表格。我的问题集中在调用 API 调用之后的频率。
    【解决方案2】:

    没有固定模式,但建议不要发送重复的网络请求以提高能源效率 (link)。您可以检查 ViewWillApear 中的时间间隔,并在一定间隔后发送网络请求,也可以使用计时器按时间间隔发送请求。第一种方法会更好,因为它仅在用户在该屏幕上时才发送请求。你可以试试下面的代码 sn-p 来了解一下

    class ViewController: UIViewController {
    
        let time = "startTime"
        let collectionView: UICollectionView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func viewWillAppear(animated: Bool) {
            super.viewWillAppear(animated)
            update()
        }
    
        private func update() {
            if let startDateTime = NSUserDefaults.standardUserDefaults().objectForKey(time) as? NSDate {
                let interval = NSDate().timeIntervalSinceDate(startDateTime)
                let elapsedTime = Int(interval)
                if elapsedTime >= 3600 {
                    makeNetworkRequest()
                    NSUserDefaults.standardUserDefaults().setObject(startDateTime, forKey: time)
                }
            } else {
                makeNetworkRequest()
                NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: time)
            }
        }
    
        func makeNetworkRequest() {
    
            //Network Request to fetch data and update collectionView
            let urlPath = "http://MyServer.com/api/data.json"
            guard let endpoint = NSURL(string: urlPath) else {
                print("Error creating endpoint")
                return
            }
            let request = NSMutableURLRequest(URL:endpoint)
            NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in
                do {
                    guard let data = data else {
                        return
                    }
                    guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject] else {
                       print("Error in json parsing")
                       return
                    }
                    self.collectionView.reloadData()
                } catch let error as NSError {
                    print(error.debugDescription)
                }
            }.resume()
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多