Objective c 获取依赖于上一个连接的多个json对象时,最好使用NSUrlConnection

Objective c 获取依赖于上一个连接的多个json对象时,最好使用NSUrlConnection,objective-c,json,nsurlconnection,querying,Objective C,Json,Nsurlconnection,Querying,我所做的是查询一个API来搜索各种数据库中的文章。涉及多个步骤,每个步骤都返回一个json对象。每个步骤都涉及到一个NSUrlConnection,该连接使用不同的查询字符串连接到API 步骤1:返回json对象,指示查询和记录集ID的状态 步骤2:从步骤1中获取记录集id,并返回可用于查询的有效数据库列表 步骤3:查询从步骤2中准备好的每个数据库,并获取包含结果的json数据数组 我不知道最好的办法是什么。使用一个nsurlconnection并在connection中重新打开该连接是否更好?

我所做的是查询一个API来搜索各种数据库中的文章。涉及多个步骤,每个步骤都返回一个json对象。每个步骤都涉及到一个NSUrlConnection,该连接使用不同的查询字符串连接到API

步骤1:返回json对象,指示查询和记录集ID的状态

步骤2:从步骤1中获取记录集id,并返回可用于查询的有效数据库列表

步骤3:查询从步骤2中准备好的每个数据库,并获取包含结果的json数据数组


我不知道最好的办法是什么。使用一个nsurlconnection并在connection中重新打开该连接是否更好?是否根据我所处的步骤完成加载。还是在每个后续连接结束时打开一个新连接更好?

几点观察

  • 网络延迟:

    我们需要注意的一个关键现象是网络延迟(听起来你也很敏感)。我们经常在idea场景中测试我们的应用程序(在具有高速互联网接入的模拟器上,或在连接到wifi的设备上)。但是,当您在真实场景中使用应用程序时,网络延迟可能会严重影响性能,您需要构建一个将此最小化的解决方案

  • 模拟次优、真实的网络情况:

    顺便说一句,如果您还没有这样做,我建议您安装“网络链接调节器”,它是“硬件IO工具”的一部分(可从“Xcode”菜单中选择“Open Developer Tool”-“More Developer Tools”)。如果安装了“网络链接调节器”,则可以让模拟器模拟各种网络体验(例如良好的3G连接、较差的边缘连接等)

  • 最小化网络请求:

    无论如何,我会尝试找出如何最小化依赖于前一个请求的单独请求。例如,我看到了步骤1和步骤2,想知道是否可以将这两个合并到一个JSON请求中。也许这是不可能的,但希望你能明白。您希望减少必须按顺序发生的单独请求的数量

    我还要看一下第3步,它们看起来必须依赖于第2步,但也许您可以同时运行其中两个第3步请求,从而减少那里的延迟效应

  • 实施:

    就如何实现这一点而言,我个人使用了一个并发
    NSOperationQueue
    ,带有一些合理的
    maxConcurrentOperationCount
    设置(例如4或5,足以享受并发性并减少延迟,但不至于对设备或服务器征税),并提交网络操作。在这种情况下,您可能会提交步骤1,完成操作将提交步骤2,完成操作将提交一系列步骤3请求,这些步骤3请求可能会并发运行

    关于如何创建一个好的网络操作对象,我可能建议使用类似的东西,它已经有了一个不错的网络操作对象(包括一个解析JSON的对象),所以您可以从这里开始

    就重新使用
    NSURLConnection
    而言,通常每个请求有一个连接。如果我有一个应用程序希望与服务器进行长时间的消息交换(例如,一个类似聊天的服务,您希望服务器能够随时向客户端发送消息,例如在聊天服务中),我已经完成了一个套接字实现,但这似乎不是正确的体系结构


  • 我会关闭第一个连接,并为每个连接创建一个新连接

    只是,别问我为什么


    顺便说一句,如果这是关于在一些性能敏感的上下文(如滚动表格或动画)中重用或创建新对象的问题,或者如果这只是发生在10000次迭代中的问题,我会理解。但您所说的是创建新对象或重用旧对象的3个对象。想一想都有什么好处

    当你说要创建一个新的连接时,你的意思是要在ConnectionIDFinishLoading函数中为前一个连接创建一个新的连接吗?ConnectionIDFinish听起来很合理。