我有一个 NSArray
链接。我想用在线文章提取器 API ( Clear Read ) 解析它们,然后将每篇文章返回的结果(一些 HTML)放入 NSString
中。
我的问题源于这样一个事实,假设我的数组中有 100 个 URL,我循环遍历数组,将每个项目射入 API 并返回一些 JSON 格式的结果。这就像一次异步触发 100 个 NSURLConnection
调用。
我不确定这是否是个问题,但是当我给它 100 个 URL(真正的字符串,没有一个是 nil)时,返回的数据通常具有 JSON 键的空值(当它们不应该t),或者返回的数据是nil
。还有一堆重复项。
我是否应该比现在更好地处理多个异步连接?如果是这样,如何?
最佳答案
几个想法:
如果您正在进行并发异步请求并使用异步
NSURLConnection
,那么您需要为该下载操作定义您自己的类以确保每个连接都跟踪自己的属性。这样,所有内容都可以封装在此类中,由此产生的下载对象可以跟踪已下载的内容、已解析的内容等。如果您不使用异步NSURLConnection
(例如,您只是使用dataWithContentsOfURL
),这甚至更容易,尽管您会失去一些NSURLConnection
提供的进度更新和/或流媒体机会。为获得最佳性能,您应该执行并发请求。话虽如此,您不应该有超过四个或五个并发请求发送到任何特定服务器。这是 iOS 强加的约束,特别是如果您的网络连接速度较慢,否则您可能会面临连接超时的风险。
如果您在模拟器上进行初步测试,您可能需要确保尝试“网络链接调节器”。它是“Xcode 的硬件 IO 工具”的一部分,可在 Downloads for Apple Developers 获得。 .有些问题(例如,如果您有太多并发请求发送到特定服务器,则会出现上述超时问题)只会在连接速度慢时出现。
话虽如此,您还想确保在具有真实网络速度的设备上测试您的解决方案。在模拟器上成功运行对设备来说过于贪婪的大规模并行任务很容易。将并发 session 数限制为五个将减少此资源问题,但这应该成为您的测试策略的一部分。
我同意 JRG-Developer 的观点,您应该研究已建立的框架,例如 AFNetworking .不过,如果排队 100 多个操作,请确保为
AFHTTPClient
的queue
设置maxConcurrentOperationCount
。我不知道您的 100 个请求需要多少数据,但请注意,众所周知,应用批准流程会拒绝在蜂窝网络上发出异常网络请求的应用。尽管应用程序审查指南中没有明确说明什么构成过度的蜂窝网络事件 Avoiding iPhone App Rejection From Apple声称您应该确保在 5 分钟内不超过 4.5mb。您可以使用 Reachability以确定您所在的网络类型,如果用户使用的是蜂窝网络(如果数据量接近此阈值),则可能会警告用户。
关于ios - NSURLConnection 和多个异步请求 - 它是否会干扰正在传输的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15594882/