【问题标题】:Load data from server quickly iOS从服务器快速加载数据 iOS
【发布时间】:2017-01-04 09:19:09
【问题描述】:

我正在开发一个购物应用程序,我在其中使用网络服务来获取数据,例如产品列表等。但是加载时间太长,因此我的应用程序真的很慢。

有没有办法解决这个问题?

以下是我尝试获取产品列表的代码。

NSURL * Url=[NSURL URLWithString:@"URL/api/product"]; 
NSData * Data=[NSData dataWithContentsOfURL:Url];
NSString *str=[[NSString alloc]initWithData:Data encoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[strinng dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil]; 

无法放入 JSON 响应,因为它太多了。

【问题讨论】:

  • 是你的后端吗?您可以更改任何请求/响应吗?
  • 请尝试使用AFNetworking,并在ViewWillAppear中发送请求
  • 在单独的线程中缓存/预取/下载是良好网络性能的关键。
  • 太慢了,为什么?你正在使用,我希望异步调用?你有良好的联系吗?您不是同时要求太多数据吗?解析是否花费了太多时间?您的服务器是否占用了太多时间?
  • 在主线程中使用同步请求会阻塞 UI,我希望你知道,因为这显然是你的问题。

标签: ios objective-c json


【解决方案1】:

没有RIGHTWRONG 方法可以解决这个问题。但是对于快速数据加载,我们可以考虑一些要点。我可以提到这些点,也可以有很多其他点:

  1. 使用 AFNetworking(用于目标 c)或 Alamofire(用于 swift)调用 Web 服务并获得响应。
  2. 不要在viewDidLoad 中做太多事情。尽量少做操作。
  3. 你可以在viewDidLoad或者viewWillAppear调用web服务(每次访问screen都会调用)
  4. 在主线程上获得响应更新 UI 后。请参考this 帖子。
  5. 如果要显示来自 URL 的图像,请异步加载。您可以使用像SDWebImage 这样的第三方库,或者使用AFNetworkingAlamofire 中提供的扩展名
  6. 如果您想在列表中显示产品列表,请使用Load More 功能。为此,您的 API 应该足够智能,使用 pagination 实现。
  7. 使用UITableViewUICollectionView 显示可重用组件。

到目前为止,我可以强调这些要点。如果我发现任何其他内容,我会更新我的答案。

【讨论】:

    【解决方案2】:

    如果你展示你为此做了什么会更好,但根据你的要求我会建议你,

    1. 使用AFNetworking与服务器通信,速度快一点。

    2. 如果您在新的ViewController 中向服务器发送请求,请确保您将在viewWillAppear 中发送请求。

    3. 尽量避免同时获取过多数据。

    4. 尝试使用Asynchronous请求意味着它不会等待。您使用异步意味着它不会等待。表示启动该操作的线程将等待任务完成后再继续。

    【讨论】:

    • 如果你在 viewWillAppear 中调用它,它会在你每次访问 screen 时被调用。如果我要进入下一个屏幕并返回,则无需再次调用 API。所以我不同意#2
    • 那么先生,我的意思是把发送请求放在哪里,因为她需要在 TableView 中显示该数据.....@Pushkraj
    【解决方案3】:

    只需使用 NSURLSession。这是来自 Apple 的优秀 API。请记住在完成块中使用 dispatch grand central get mainQueue 来更新任何 UI。

    【讨论】:

      【解决方案4】:

      在应用启动时开始从 API 加载数据 (AppDelegate) 并将响应数据存储在模型中。这样,时间延迟就会减少。您也可以尝试将响应保存到 CoreData 中,并在加载视图时刷新数据。

      希望这会有所帮助。

      【讨论】:

      • 我有不同的模块,比如产品列表会显示产品和购物车列表的所有详细信息,其中所有产品都是自发添加或删除的,那么我如何在应用程序代理中添加所有内容? :/有点困惑,你能解释一下吗:)
      • 那么你必须使用核心数据。我的意思是初始化类以从 AppDelegate 中的服务器获取数据,以便在打开 VC 之前开始获取数据。在你的情况下 coreData 将是要走的路。
      • 好吧,我真的不太了解核心数据,我会用谷歌搜索它:P 但是你有任何链接可以让我轻松完成整个过程吗?
      • 将它们保存在 CoreData 中并检索会更慢
      • 保存到 CoreData 一次,这样您就永远不会出现空白屏幕,然后在后台获取数据并更新。提供更好的用户体验。 @马特
      【解决方案5】:

      当您收到大量数据时,您无法采取任何措施来加快处理速度。

      1. 您应该拆分您的 API,可能一个 API 会给您列表 产品。
      2. 制作一个 API 以仅发送请求数量的产品和 产品数量应根据您的手机屏幕分辨率 以及可以在那里展示的产品数量。例如,它 在 iPhone 4 上可能是 4,而在 iPhone 6 上可能是 6。在滚动时再次调用该 API 以接收另外 4 或 6 个产品。
      3. 单击特定产品时,使用另一个 API 获取其 内容。

      【讨论】:

      • 你是对的,但不幸的是我不能做这一切:(我能做的就是改进我的代码。
      • 您并不孤单。要么要求他们做出改变,要么不得不忍受它:(
      • 如果您收到的数据较少但需要大量时间,那么如果您提供代码,我们可以做一些事情。
      • NSURL * Url=[NSURL URLWithString:@"dealnxt.com/api/product"]; NSData * Data=[NSData dataWithContentsOfURL:Url]; NSString *str=[[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding]; NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[stringng dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil]; 这是我用来获取产品列表和详细信息的代码
      • 数据太多
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      相关资源
      最近更新 更多