Iphone ScrollView内容异步下载问题
我有UIScrollView,里面有很多UIImageView。在loadView方法中,我为每个子视图UIImageView图像分配一些临时图像,并启动几个线程从internet异步下载图像。每个线程下载并分配图像,如下所示: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
NSData *data = [NSData dataWithContentsOfURL:URL];
UIImage *img = [UIImage imageWithData:data];
img_view.image = img;
这里是问题-我希望图片会改变后,每个图像下载我只能看到临时图像,直到所有的图像将下载。UIScrollView在图像下载时仍会进行交互-我可以在其中滚动临时图像,并看到滚动条和无块运行循环,但下载的图像不会更新
我想做的是:
NSOperation
和NSOperationQueue
您可以简单地将所有内容“加载”到这些方法中,并让它们找出最佳方式
检索图片。如果您一直在构建新线程,那么在某一点上您就失去了线程的优势,即每个线程的开销都会增加,而CPU时间也就只有这么多了
首先对图片的URL列表进行排序,以便距离用户最远的图片(在滚动视图意义上)最后加载,然后开始将加载操作添加到NSOperationQueue,然后启动该操作。然后,这些类将平衡各种情况,并为您节省大量的代码逻辑,以处理可能爆发的场景
几周前我发现这很有用:
Marcus Zarra列出了一个简单的示例,让您开始学习
编辑:哎呀。。。为了回答您的问题:)如果这不会导致图片更新,那么您可能需要在操作完成时发送特定的“更新”消息。
如果这是你应用程序的很大一部分,我建议你构建一个PictureObject并将功能移到其中。因此,当添加PictureObject时,您使用URL实例化它,它会显示一个虚拟图片作为其视图。您将此PictureObject交给NSOperation,NSOperation将检索其URL并加载图片并将其设置在PictureObject上。
通过这种方式,它始终是异步的,您不必处理循环或测试是否下载了图片等。
希望这是有意义的。我不鼓励使用线程进行此用途,并使用异步API在网络上进行数据检索
NSData *data = [NSData dataWithContentsOfURL:URL];
这个函数调用将一些数据发送到一个套接字,然后放在那里并锁定线程,直到它收到响应。如果不进行任何同步调用,就不必担心锁定UI线程,问题就会变得简单得多
我会使用库或访问您的数据,并在一个线程上完成所有更新。API有一个轻微的学习曲线,但它比正确管理线程小得多。我强烈推荐ASIHTTP库,它简直棒极了。您可以将请求委托设置为进度小部件,并限制您的连接以使用边缘