Iphone ScrollView内容异步下载问题

Iphone ScrollView内容异步下载问题,iphone,uiscrollview,uiimageview,Iphone,Uiscrollview,Uiimageview,我有UIScrollView,里面有很多UIImageView。在loadView方法中,我为每个子视图UIImageView图像分配一些临时图像,并启动几个线程从internet异步下载图像。每个线程下载并分配图像,如下所示: NSData *data = [NSData dataWithContentsOfURL:URL]; UIImage *img = [UIImage imageWithData:data]; img_view.image = img

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

    NSData  *data   = [NSData dataWithContentsOfURL:URL];
    UIImage *img    = [UIImage imageWithData:data];
    img_view.image  = img;
这里是问题-我希望图片会改变后,每个图像下载我只能看到临时图像,直到所有的图像将下载。UIScrollView在图像下载时仍会进行交互-我可以在其中滚动临时图像,并看到滚动条和无块运行循环,但下载的图像不会更新

我想做的是:

  • 在下载线程中调用sleep(),这没有帮助
  • 为ScrollView内部的每个ImageView和ScrollView调用setNeedsDisplay——这没有帮助
  • 怎么了?谢谢

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

    再更新一次。我修复了这个问题,每次下载一个图像时,从下载线程启动新线程,然后退出当前线程(而不是在循环中在一个线程中下载多个图像,并在所有图像下载后才退出线程)。显然,这不是一个好的解决方案,必须有正确的方法

    高新贝(无需phun)

    您描述的情况听起来像是
    NSOperation
    NSOperationQueue
    您可以简单地将所有内容“加载”到这些方法中,并让它们找出最佳方式 检索图片。如果您一直在构建新线程,那么在某一点上您就失去了线程的优势,即每个线程的开销都会增加,而CPU时间也就只有这么多了

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

    几周前我发现这很有用:

    Marcus Zarra列出了一个简单的示例,让您开始学习

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

    我不鼓励使用线程进行此用途,并使用异步API在网络上进行数据检索

    NSData  *data   = [NSData dataWithContentsOfURL:URL];
    
    这个函数调用将一些数据发送到一个套接字,然后放在那里并锁定线程,直到它收到响应。如果不进行任何同步调用,就不必担心锁定UI线程,问题就会变得简单得多

    我会使用库或访问您的数据,并在一个线程上完成所有更新。API有一个轻微的学习曲线,但它比正确管理线程小得多。我强烈推荐ASIHTTP库,它简直棒极了。您可以将请求委托设置为进度小部件,并限制您的连接以使用边缘