【发布时间】:2013-08-27 06:57:43
【问题描述】:
我注意到像 Intagram 这样的应用程序使用UICollectionViews 来显示照片的提要。
我还注意到这些照片的单元格以某种方式放置在屏幕上在实际照片完全下载之前。然后,当下载完成时,该照片会很好地显示在正确的单元格中。
我想复制该功能,但我不知道如何去做。
我目前正在下载一个大型 JSON 对象,我将其转换为 NSDictionaries 数组。每个NSDictionary 都包含有关每张照片的信息,并且在这些信息中,会显示一个 URL。在这个网址,我可以在我的UICollectionViewCells找到我需要下载并显示的对应图片
就目前而言,我会迭代此列表并为我看到的每个 URL 启动下载。下载完成后,我使用[self.collectionView reloadData] 重新加载collectionview。但是,您可以想象,如果我有 30 个单元格都想要一张图片,那么就会有很多 reloadData 调用。
我正在使用AFNetworking处理下载,这里是我根据我之前提到的URL调用的方法:
-(void) downloadFeedImages:(NSString *) photoURL imageDescs:(NSDictionary*)imageDescs photoId:(NSString *)photoID{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
NSString* foofile = [directory stringByAppendingPathComponent:photoID];
if([[NSFileManager defaultManager] fileExistsAtPath:foofile]){
// IF IMAGE IS CACHED
[self.collectionView reloadData];
return;
}
NSLog(@"photoURL: %@", photoURL);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:photoURL]];
AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request
imageProcessingBlock:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// Save Image
NSLog(@"URL-RESPONSE:%@", image);
NSString *myFile = [directory stringByAppendingPathComponent:photoID];
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:myFile atomically: YES];
[self.collectionView reloadData];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"ERROR: %@", [error localizedDescription]);
}];
[[WebAPI sharedInstance] enqueueHTTPRequestOperation:operation];
}
所以基本上,我想知道如何实现 Instagram 和类似应用程序在显示带有图像的提要时所具有的功能。 此外,我想知道一种为每个单元格启动下载的好方法,当下载完成后,更新那个单元格,而不是使用 [reloadData]
重绘整个视图谢谢
【问题讨论】:
标签: ios objective-c cocoa-touch afnetworking uicollectionview