8

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

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

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

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

4

2 回答 2

8

几个想法:

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

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

  3. 如果您在模拟器上进行初步测试,您可能需要确保尝试“网络链接调节器”。它是“适用于 Xcode 的硬件 IO 工具”的一部分,可在Apple Developers 下载处获得。有些问题(例如,如果您有太多并发请求发往特定服务器,则上述超时问题)只会在慢速连接中表现出来。

  4. 话虽如此,您还需要确保在具有真实网络速度的设备上测试您的解决方案。在对设备过于贪婪的模拟器上成功运行大规模并行任务很容易。将并发会话数限制为 5 个将减少此资源问题,但它应该成为您的测试策略的一部分。

  5. 我同意 JRG-Developer 的观点,您应该研究已建立的框架,例如AFNetworking。但是,如果排队 100 多个操作,请确保为 的maxConcurrentOperationCount设置queueAFHTTPClient

  6. 我不知道您的 100 个请求需要多少数据,但请注意,众所周知,应用程序批准过程会拒绝在蜂窝网络上发出特殊网络请求的应用程序。什么构成过度的蜂窝网络活动在应用程序审查指南中没有明确说明,尽管避免 Apple 拒绝 iPhone 应用程序声称你应该确保你在 5 分钟内不超过 4.5mb。您可以使用Reachability来确定您所在的网络类型,并可能在用户使用蜂窝网络时警告用户(如果数据量接近此阈值)。

于 2013-03-24T05:22:55.553 回答
3

您是否考虑过使用第三方框架(例如AFNetworking)并限制一次发生的异步调用的数量?也许这可能有助于/解决您的问题。

特别是,您可能会考虑创建一个networking manager类来创建和管理AFHTTPClient(s),该类又管理AFHTTPRequestOperations,用于您点击的每个端点(基本 URL)。

于 2013-03-24T03:41:57.577 回答