NSURLConnection 和多个异步请求 - 是否会扰乱正在传输的数据?

问题描述 投票:0回答:2

我有一个

NSArray
的链接。我想使用在线文章提取器 API (Clear Read) 解析它们,并根据每篇文章返回的结果(一些 HTML)将其放入
NSString

我的问题源于这样一个事实:假设我的数组中有 100 个 URL,我循环遍历数组,将每个项目拍摄到 API 中,并以 JSON 格式返回一些结果。这相当于一次异步调用 100 个

NSURLConnection
调用。

我不确定这是否会成为问题,但是当我给它 100 个 URL(真正的字符串,没有一个是 nil)时,返回的数据通常具有 JSON 键的空值(当它们不应该时) ,或者返回的数据是

nil
。还有一堆重复的。

我应该比现在更好地处理多个异步连接吗?如果是这样,怎么办?

ios objective-c nsurlconnection nsurlrequest
2个回答
8
投票

一些想法:

  1. 如果您正在执行并发异步请求并使用异步

    NSURLConnection
    ,那么您需要为此下载操作定义自己的类,以确保每个连接都跟踪其自己的属性。这样,所有内容都可以封装在此类中,其中生成的下载对象可以跟踪下载的内容、解析的内容等。如果您不使用异步
    NSURLConnection
    (例如,您只是使用
    dataWithContentsOfURL
    ),尽管您会失去一些
    NSURLConnection
    提供的进度更新和/或流媒体机会,但它甚至更容易。

  2. 为了获得最佳性能,您应该执行并发请求。话虽如此,发送到任何特定服务器的并发请求不应超过四到五个。这是 iOS 强加的限制,特别是如果您的网络连接速度较慢,则可能会面临连接超时的风险。

  3. 如果您正在模拟器上进行初步测试,您可能需要确保尝试“网络链接调节器”。它是“Xcode 的硬件 IO 工具”的一部分,可在“Apple 开发人员下载”中获取。有些问题(例如,如果您有太多并发请求发送到特定服务器,则会出现上述超时问题),这些问题仅在缓慢的连接中显现出来。

  4. 话虽如此,您还想确保在具有真实网络速度的设备上测试您的解决方案。在模拟器上成功运行对设备来说太贪婪的大规模并行任务很容易。将并发会话数限制为 5 将减少此资源问题,但它应该成为您的测试策略的一部分。
  5. 我同意 JRG-Developer 的观点,即您应该研究已建立的框架,例如
  6. AFNetworking

    。不过,如果要排队 100 多个操作,请务必将 maxConcurrentOperationCount 设置为

    queue
    AFHTTPClient
    
    

  7. 我不知道您的 100 个请求需要多少数据,但请注意,众所周知,应用程序审批流程会拒绝在蜂窝网络上发出特殊网络请求的应用程序。尽管“避免 Apple 拒绝 iPhone 应用程序”声称您应该确保 5 分钟内不超过 4.5mb,但应用程序审查指南中并未明确说明什么构成过度的蜂窝网络活动。您可以使用
  8. Reachability

    来确定您所在的网络类型,并且可能会警告用户是否使用蜂窝网络(如果数据量接近此阈值)。

  9. 您是否考虑过使用第三方框架 - 例如
AFNetworking

3
投票

特别是,您可以考虑创建一个 networking manager 类来创建和管理

AFHTTPClient(s)

,而该类又为您点击的每个端点(基本 URL)管理

AFHTTPRequestOperations
© www.soinside.com 2019 - 2024. All rights reserved.