为每个异步映像下载创建一个新的委托类?

时间:2010-03-26 04:46:43

标签: iphone asynchronous twitter delegates nsurlconnection

首先,我使用NSURLConnection从twitter下载JSON数据。然后,我使用第二个NSURLConnection下载相应的用户头像图像(图像的URL从第一次数据下载中解析)。

对于第一个数据连接,我将我的TwitterViewController设置为NSURLConnection委托。我已经创建了一个单独的类(ImageDownloadDelegate)来充当处理图像的第二个NSURLConnection的委托。推文下载完毕后,我正在使用此代码获取头像:

for(int j=0; j<[self.tweets count]; j++){
    ImageDownloadDelegate *imgDelegate = [[ImageDownloadDelegate alloc] init];

    Tweet *myTweet = [self.tweets objectAtIndex:j];
    imgDelegate.tweet = myTweet;
    imgDelegate.table = timeline; //to reload the data

    NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:myTweet.imageURL]
                                                                  cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                              timeoutInterval:60];
    imgConnection = [[NSURLConnection alloc] initWithRequest:request delegate:imgDelegate];
    [imgDelegate release];  
}

因此,基本上为每个需要下载的图像创建了一个新的委托类实例。这是解决这个问题的最好方法吗?如果我只创建一个委托类的实例,那么无法确定哪个图像与哪个推文相关联,对吗?我也无法确定下载图像的确切顺序。

算法工作得很好......我只是想知道我是否能以最有效的方式解决这个问题。

2 个答案:

答案 0 :(得分:2)

将图片下载放入类似NSOperationQueue的内容。

完成图像下载后,将其保存到缓存目录,然后发送包含原始图像URL的通知以及图像现在所在的文件名。

任何想要图片的人都可以收听通知。如果不再关心(比如已经滚动屏幕的单元格),那么他们将取消订阅通知,因此图像将只是坐在那里,直到系统清理缓存目录...

在下载之前检查并查看磁盘上是否已存在图像也是微不足道的,只需保留URL到文件名的映射。

答案 1 :(得分:0)

您可能会使用ASIHTTPRequest的排队功能。您可以创建ASINetworkQueue来处理有序的请求队列,每个请求都可以在完成时执行行为,以便您可以跟踪响应请求。

请求基于NSOperation类和NSOperationQueue上的队列,因此该框架为您完成了大量的编码工作。