首先,我使用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];
}
因此,基本上为每个需要下载的图像创建了一个新的委托类实例。这是解决这个问题的最好方法吗?如果我只创建一个委托类的实例,那么无法确定哪个图像与哪个推文相关联,对吗?我也无法确定下载图像的确切顺序。
算法工作得很好......我只是想知道我是否能以最有效的方式解决这个问题。
答案 0 :(得分:2)
将图片下载放入类似NSOperationQueue的内容。
完成图像下载后,将其保存到缓存目录,然后发送包含原始图像URL的通知以及图像现在所在的文件名。
任何想要图片的人都可以收听通知。如果不再关心(比如已经滚动屏幕的单元格),那么他们将取消订阅通知,因此图像将只是坐在那里,直到系统清理缓存目录...
在下载之前检查并查看磁盘上是否已存在图像也是微不足道的,只需保留URL到文件名的映射。
答案 1 :(得分:0)
您可能会使用ASIHTTPRequest的排队功能。您可以创建ASINetworkQueue
来处理有序的请求队列,每个请求都可以在完成时执行行为,以便您可以跟踪响应请求。
请求基于NSOperation
类和NSOperationQueue
上的队列,因此该框架为您完成了大量的编码工作。