2016-10-05 24 views
0

我正在構建一個應用程序,該應用程序填充collectionView中的數據。數據來自API調用。當屏幕第一次加載時,我得到產品並將它們本地存儲在我的ViewController中。從API模式問題加載數據

我的問題是什麼時候應該再次獲得產品以及如何處理屏幕更換。我的數據會在應用程序運行時發生變化(敏感屬性,如價格),但我無法找到每次調用viewWillAppear時API調用的理想解決方案。

任何人都可以請告訴我什麼是處理這種情況的最佳模式。我的第一次是檢查是否 viewWillAppear,然後撥打電話。包括一個定時器,例如每10-15分鐘再次檢查一次。

謝謝您的輸入。

回答

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

我不確定數據是什麼樣子以及您的API在詳細工作方式,但是當您的API更新數據時,您當然不必調用viewWillAppear

當您的數據更新時,有兩種可能的解決方案需要通知。 您可以使用通知讓您知道API是否提供了一些數據。提供數據後,您的通知會調用更新集合視圖。您還可以在包含來自API的數據的對象或結構中包含「didSet」調用。每次更新對象或結構時,將調用didSet例程來更新您的集合視圖。

要更新您的集合視圖,只需調用方法reloadData(),集合視圖將自行更新並查詢現在包含來自API的新接收數據的數據源。

希望這會有所幫助。

+0

我可以更新數據並重新加載表。我的問題主要集中在進行調用後多久不進行API調用。 – PoolHallJunkie