代码之家  ›  专栏  ›  技术社区  ›  Slee

在iPhone/iPad上连续运行多个后台线程

  •  0
  • Slee  · 技术社区  · 14 年前

    我必须下载大量的图片,我是在后台线程上做的,问题是所有下载的数据在我回到主线程之前都不会被释放,这对于几百个图片来说是很好的,但是当我进入数千个应用程序时,内存耗尽,崩溃。

    所以我需要连续运行几个后台线程,这样我就可以批量下载200个图像,这样我的自动释放池就可以清除和释放内存。

    我不知道该怎么做。我需要在主线程上使用某种递归函数来调用后台线程,并跟踪批处理,这样它就知道接下来要调用哪个。我知道在线程之间来回传递值会导致一些问题,所以我不确定如何处理这个问题?

    以前有人解决过这样的问题吗?

    3 回复  |  直到 13 年前
        1
  •  0
  •   hotpaw2    14 年前

    在释放内存之前,您不需要等待所有内容下载。您可以使用performselectornmainthread将每个映像或一小批映像传递给主线程,并让主线程在将数据缓存到存储或使用数据时释放内存。然后在后台线程中继续进行,直到完成,并再次使用PerformSelectorOnMainthread传递“完成”消息。

        2
  •  1
  •   sjagr    14 年前

    nsOperationQueues为您解决了这个问题。您创建了一个从为您下载的nsOperation派生的类。然后创建nsOperationQueue并将下载内容添加到队列中。您可以控制队列的最大并发性等。

    http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/index.html

        3
  •  0
  •   Kirk Woll    13 年前

    使用nsInvocationOperation。这将解决问题,而不是将代码分成块。这是我用的样品

    NSOperationQueue *downloadQueue = [NSOperationQueue new]; for (Product *cProduct in productsMasterArray) {
    NSInvocationOperation *downloadOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImages:) object:cProduct.ITEM_CODE]; [downloadQueue addOperation:downloadOperation]; [downloadOperation release]; }