从 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()
}
我正在构建一个在 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()
}