从 API 模式加载数据问题

Loading data from API pattern issue

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

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

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

感谢您的意见。

我不确定数据是什么样子以及您的 API 详细工作方式,但您当然不必在 API 更新时调用 viewWillAppear数据.

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

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

希望对您有所帮助。

没有固定模式,但建议不要重复发送网络请求以提高能源效率(link)。您可以在 ViewWillApear 中检查时间间隔并在一定间隔后发送网络请求,或者可以使用计时器按时间间隔发送请求。第一种方法会更好,因为它仅在用户位于该屏幕上时才发送请求。您可以尝试按照以下代码片段来理解这个想法

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()
    }