我正在构建一个用collectionView
填充数据的应用。数据来自API调用。屏幕首次加载时,我会获取产品并将其存储在我的ViewController
。
我的问题是我应该何时再次获得产品以及如何处理屏幕更改。我的数据会在应用运行时发生变化(价格等敏感属性),但每次调用viewWillAppear
时,我都找不到理想的API调用解决方案。
任何人都可以告诉我处理这种情况的最佳模式是什么。我的第一个问题是检查[CustomObject].isEmpty
上是否viewWillAppear
,然后拨打电话。例如,包括每10-15分钟再次检查一次的计时器。
感谢您的投入。
答案 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()
}