【问题标题】:sending More than 200 images to server in Multitasking Mode?在多任务模式下向服务器发送超过 200 张图像?
【发布时间】:2014-05-02 05:41:06
【问题描述】:

我想通过NSOperationQueue将300张图片上传到服务器。我必须使用 每张图片只有一个 URL,所以我将使用 300 个 URL。换句话说,300 个NSOperations 用于将这些 URL 推送到 NSOperationQueue

这是正确的方法吗?不会影响主线程中的应用性能吗?

【问题讨论】:

  • 请有理由投反对票!!!
  • 请在 url 上添加更多信息。例如,您可能会在 www.xyz.com/1 上上传第一张图片...在 www.xyz.com/2 上上传第二张图片???网址是完全不同还是只是数字(例如)变化??
  • 光是什么意思?你是说有可能吗?

标签: ios image nsoperationqueue


【解决方案1】:

如果您想并行运行 300 次上传,那么无论平台如何,这都是一个相当糟糕的主意。

【讨论】:

  • 这假设操作队列尝试一次执行所有 300 个。将队列设置为一次只做几个是微不足道的。
  • @rmaddy 创建 300 个线程是个坏主意。但是 NSoperationQueue 不这样做。我根据系统条件限制同时运行的操作数。我认为这个答案是不正确的。
  • @Marcin,@avt,@rmaddy,我们在tableview中考虑lazyloading的时候,很多下载操作都加到Queue中了,怎么可能?
  • 如果中途禁用互联网连接,是否能确保所有图片加载到服务器的准确性?
【解决方案2】:

主线程的性能不会受到影响,因为无论线程有多少,主线程都不会占用太多时间。但问题是在大量并行运行的线程之间进行过多的上下文切换会给它们执行的时间少得多。永远不要将并行运行的线程数量保持在如此庞大的数量。我建议一次不要超过 5 个线程。

与在线程中运行上传过程相关的另一个优势(但仅在单个线程中)如果上传过程在上传过程中停止,假设在上传 50 张图像之后,那么至少您将在那里拥有这 50 张图像。如果你在线程中完成这一切,那么即使在上传完成一半之后,你也可能没有完全上传图像。

【讨论】:

  • 你提出了很好的建议。但我已经勾选了 Marcin Answer。我已经给你投票了:)
  • 我们在tableview中考虑lazyloading的时候,很多下载操作都加到Queue中了,怎么可能?
  • @JeffWood NSOperationQueue 不能以这种方式工作。它总是以非常小的数量限制并发运行的操作的数量。并且在之前的操作完全完成之前不会开始新的操作。
  • @avt,NSoperationQueue 将通过 FIFO 一次只运行一个 NSoperation。那个单个操作将并发运行。当我们使用多个 NSoperationqueues 时,我们可以同时运行多个操作。我理解对吗?
  • @JeffWood NSOperationQueue 可以同时运行多个操作。您可以使用 NSOperationQueue 的“setMaxConcurrentOperationCount”方法设置它们的最大数量。关于 FIFO - 如果 A 在 B 之前被推送到 NSOperationQueue,它将在 B 之前启动,但由于并发性,它可以在 B 之后完成。
【解决方案3】:

可以将 300 个 NSOperation 推送到 NSoperationQueue。 NSoperationQueue 不会同时运行所有这些——它会限制当前运行的操作的数量。您还可以使用手动设置并发操作数

- (void)setMaxConcurrentOperationCount:(NSInteger)count

设置接收者可以并发操作的最大数量 执行。指定的值只影响接收器和 其队列中的操作。其他操作队列对象也可以 并行执行它们的最大数量的操作。减少 并发操作的数量不影响任何操作 目前正在执行。如果您指定值 NSOperationQueueDefaultMaxConcurrentOperationCount(即 推荐),最大操作数可以动态变化 基于系统条件。

更新:

设置 'MaxConcurrentOperationCount' 您设置了上限。但是系统自己决定同时运行多少下载。因此,即使您将 MaxConcurrentOperationCount 设置为 300,实际上通常系统也会同时运行 1-10 个操作。

系统不知道操作是做什么的。 AFAIK 它仅分析 CPU 和内存使用情况以确定同时运行的操作数。因此,即使您的连接不好,它也可以同时运行 10 个操作——这不是一个好主意。在这种情况下,如果您的操作使用网络,最好将 MaxConcurrentOperationCount 设置为 1-2(用于 GPRS/EDGE 连接)和 5-10(用于 WiFi)。

【讨论】:

  • 应用程序性能会受到 RAM 容量和处理器速度的影响..
  • @JeffWood NSOperation 本身并不占用大量内存。我假设您不会将所有 300 张图像都存储在内存中。我刚刚检查过 - 创建 300 个 NSOperations 不会花费很多时间。
  • 为什么这被否决了?这是迄今为止最好的答案。
  • rmaddy,所以,你是说,只将 300 个 NSoperation 推送到一个 Global NSoperationQueue 是可以的。如果中途禁用 Internet 连接,是否能确保将所有图像加载到服务器的准确性?
  • @JeffWood 不,您必须自己检查操作是否成功。而且它不取决于将多少操作添加到 NSOperationQueue。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多