从API模式问题加载数据

时间:2016-10-05 10:38:09

标签: ios objective-c swift uicollectionview viewwillappear

我正在构建一个用collectionView填充数据的应用。数据来自API调用。屏幕首次加载时,我会获取产品并将其存储在我的ViewController

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

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

感谢您的投入。

2 个答案:

答案 0 :(得分:1)

我不确定数据是什么样的以及您的API如何运作,但当您的API更新数据时,您当然不必致电viewWillAppear

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

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

希望这有帮助。

答案 1 :(得分:0)

没有固定模式,但建议不要发送重复的网络请求以提高能效(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()
    }