2016-10-05 3 views
0

collectionView에 데이터를 채우는 앱을 구축 중입니다. 데이터는 API 호출에서 가져옵니다. 화면이 처음로드되면 제품을 가져 와서 내 로컬 ViewController에 저장합니다.API 패턴 문제에서 데이터로드 중

제 질문은 제품을 다시 받아야하는시기와 화면 변경을 처리하는 방법입니다. 앱이 실행 중일 때 (가격 같은 민감한 속성) 데이터가 변경되지만 viewWillAppear이 호출 될 때마다 API 호출을 수행하는 데 이상적인 솔루션을 찾지 못합니다.

아무에게도이 상황을 처리하는 가장 좋은 패턴이 무엇인지 말해 줄 수 있습니까? 처음에는 [CustomObject].isEmptyviewWillAppear에 있는지 확인한 다음 전화를 겁니다. 예를 들어 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 호출을 호출 한 후가 아닌 API 호출을 만드는 빈도에 중점을 둡니다. – PoolHallJunkie