ScrollView内容异步下载问题

时间:2010-04-27 08:26:19

标签: iphone uiscrollview uiimageview

我有UIScrollView里面有很多UIImageView。在loadView方法中,我为每个子视图UIImageView图像分配一些临时图像,并启动多个线程以从Internet上异步下载图像。每个线程按如下方式下载和分配图像:

    NSData  *data   = [NSData dataWithContentsOfURL:URL];
    UIImage *img    = [UIImage imageWithData:data];
    img_view.image  = img;

这是问题 - 我希望在我下载的每个图像之后图片都会发生变化,我只能看到临时图像,直到下载所有图像。 UIScrollView在图像下载时仍然可以互动 - 我可以在其中滚动临时图像并查看滚动条,没有任何块运行循环,但下载的图像不会更新..

我试图做的事情:

  1. 在下载主题中调用sleep() - 没有帮助。
  2. 为ScrollView和ScrollView中的每个ImageView调用setNeedsDisplay - 没有帮助。
  3. 怎么了?感谢。

    更新。我尝试了一些线程数和下载图像数量的实验。现在我确定 - 只有在线程结束时才会重绘图像。例如 - 如果我用一个线程加载100个图像 - 图像在所有图像下载后更新一次。如果我将线程数增加到10 - 图片更新10次 - 每次更新会出现10个图像。

    还有一次更新。我通过每次下载一个图像时从下载线程中盯着新线程修复问题并退出当前线程(而不是在循环中的一个线程中下载几个图像并且仅在全部下载时退出线程)。显然这不是一个好的解决方案,必须有正确的方法。

2 个答案:

答案 0 :(得分:1)

我不鼓励使用线程来实现这种用法,并使用异步API在网络上进行数据检索。

NSData  *data   = [NSData dataWithContentsOfURL:URL];

此函数调用从套接字发送一些数据然后坐在那里并锁定线程,直到它收到响应。如果你不进行任何同步调用,你不必担心锁定UI线程,你的问题变得更加简单。

我会使用ASIHTTP库或NSURLConnection来访问您的数据,并在一个线程上执行所有更新。 API有一个略微的学习曲线,但它比正确管理线程 小。我会 强烈 推荐ASIHTTP图书馆,它只是摇滚。您可以将请求委托设置为进度窗口小部件,并限制连接以使用边缘。

答案 1 :(得分:0)

嗨Newbee(没有意图)

您描述的情况听起来像NSOperationNSOperationQueue的候选人 您可以简单地“加载”这些方法的所有内容,让他们弄清楚如何最好 检索图片。如果你继续构建新线程,那么在某些时候你会失去线程的优势,即每个线程的开销都会增加,并且只有很多CPU时间可用。

首先对图片的URL列表进行排序,以便最远离用户(在scrollView意义上)最后加载,然后开始将加载操作添加到NSOperationQueue,然后启动操作。然后,这些类将平衡事物并为您节省大量编码逻辑,以处理可能爆发的场景。

几周前我发现这有用了: NSOperation tutorial

马库斯·扎拉(Marcus Zarra)列出了一个很好的简单例子来帮助你入门。

编辑:哎呀...并回答你的问题:)如果这不会导致你的图片更新,那么你可能需要在操作完成后发送一条特定的“更新”消息。 如果这是你的应用程序的很大一部分,我建议你构建一个PictureObject并移动其中的功能。因此,在添加PictureObject时,您可以使用URL对其进行实例化,并在其视图中显示虚拟图片。您将此PictureObject交给您的NSOperation,后者检索它的URL加载图片并将其设置在PictureObject上。 这样它一直是异步的,你不必处理循环或测试是否下载了图片等。 希望它有意义。