2010-04-27 97 views
2

我有UIScrollView里面有很多UIImageView。在loadView方法中,我为每个子视图UIImageView图像分配一些临时图像,并启动多个线程以异步下载来自Internet的图像。每个线程下载和分配图片如下:ScrollView内容异步下载问题

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

这是问题所在 - 我希望通过我下载每个图像后画面会发生变化可以看到只是暂时的图像,直到所有的图像将下载。 UIScrollView中仍然同时图片下载互动 - 我可以滚动里面暂定图像,看看运行循环滚动条并没有什么块,但下载的图像没有更新..

我试图这样做:

  1. 调用sleep ()在下载线程 - 没有帮助。
  2. 为ScrollView和ScrollView中的每个ImageView调用setNeedsDisplay - 没有帮助。

怎么了?谢谢。

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

再一次更新。我通过每次下载一个图像并退出当前线程时从下载线程中盯着新线程来解决问题(而不是在下载线程中的一个线程中下载多个图像并退出线程)。显然这不是一个好的解决方案,必须有正确的方法。

回答

1

我会劝阻使用这种用法的线程,并使用异步API在网络上进行数据检索。

NSData *data = [NSData dataWithContentsOfURL:URL]; 

该功能调用发送一些数据从一个插座然后坐在那里,直到它接收一个响应锁定螺纹。如果你没有进行任何同步调用,你不必担心锁定UI线程,你的问题变得更简单。

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

0

嗨Newbee(无phun意)

你描述像一个候选人的声音为NSOperation的情况和NSOperationQueue 你可以简单的“负荷”一切都关掉这些方法,让他们弄清楚如何最好 检索图片。如果你不断创建新的线程,那么在某些时候你就失去了线程的优势,即每个线程的开销都会增长,并且只有很多CPU时间才能被使用。

从图片的URL列表开始,以便距离用户最远的一个(以scrollView的方式)最后加载,然后开始将加载操作添加到NSOperationQueue,然后启动操作。然后这些类将平衡事情并为您节省大量的编码逻辑来处理可能爆发的场景。

,我发现这是很有帮助的几个星期前: NSOperation tutorial

马库斯Zarra勾画出一个漂亮的简单的例子,让你开始。

编辑:哎呀......并回答你的问题:)如果这不会导致你的图片更新,那么你可能需要发送一个特定的“更新”消息,当操作完成。 如果这是你的应用程序的很大一部分,我会建议你建立一个PictureObject并在其中移动功能。所以当添加一个PictureObject的时候,你用一个URL实例化它,并且它显示一张假图片作为它的视图。你将这个PictureObject交给你的NSOperation,它检索它的URL加载图片并将其设置在PictureObject上。 这种方式一路是异步的,你不必处理循环或测试图片是否下载等。 希望它是有道理的。