gpt4 book ai didi

ios - 将图像从 URL 保存到 iOS 目录

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:09:15 27 4
gpt4 key购买 nike

我想将大量 (800-2000) 图片从服务器保存到 iPhone 应用程序目录(文档目录)。

首先,我必须检查这些图像是否已经在 iPhone 目录中。

我使用此代码下载一张图片:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
[NSURLConnection connectionWithRequest:request delegate:self];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"pkm.jpg"];
NSData *thedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://a3.twimg.com/profile_images/414797877/05052008321_bigger.jpg"]];
[thedata writeToFile:localFilePath atomically:YES];

请帮助我,任何建议: 1. 将所有图像以原始名称保存在 iPhone 目录中,而不是“pkm.jpg” 2. 用名称保存图像:从 05052008321_bigger 到 05052008350_bigger 3.检查图像是否已经下载,不要再次下载。

我知道,也许这不仅仅是一个问题。但一些建议、方向会非常好。

提前致谢。

最佳答案

几个 react :

  1. 您正在启动一个 NSURLConnection connectionWithRequest(它会触发 NSURLConnectionDataDelegate 方法),但是您显然忽略了它并启动了一个 dataWithContentsOfURL。你应该选择其中之一,但不要两者都做。

  2. 我建议您采用基于 NSOperation 的解决方案,因为您肯定希望 (a) 享受并发性;但是 (b) 将并发操作限制在某个合理的数量(例如 4 或 5),否则您将遇到请求超时和失败的情况。

  3. 在获取文件名方面,您可以使用 NSURL 中的 lastPathComponent 检索文件名。 (下面使用的我的下载操作实际上会在您不提供明确的文件名时自动使用它。)

  4. 您没有说明如何从远程服务器确定文件名列表,因此我们必须了解您如何知道要检索哪些图像。

  5. 如果这是为了您自己的目的,这很好,但我听说 Apple 拒绝通过蜂窝连接请求过多数据的应用程序(2000 张图像肯定符合条件)。坦率地说,即使 Apple 没有大惊小怪,你也确实应该在使用那么多数据计划之前询问用户。您可以使用 Reachability确定用户是通过 wifi 还是通过蜂窝网络连接,如果是后者,您可能需要发出警告。

但我会建议一些看起来像的东西(假设你有一些 NSArrayNSString 版本的 URL ...显然可以根据你的列表的任何形式调整它网址位于:

NSOperationQueue *downloadQueue = [[NSOperationQueue alloc] init];
downloadQueue.maxConcurrentOperationCount = 4;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

for (NSString *urlString in urlStrings)
{
NSURL *url = [NSURL URLWithString:urlString];
NSString *path = [docsPath stringByAppendingPathComponent:[url lastPathComponent]];
if (![fileManager fileExistsAtPath:path]) {
DownloadOperation *downloadOperation = [[DownloadOperation alloc] initWithURL:url];
downloadOperation.downloadCompletionBlock = ^(DownloadOperation *operation, BOOL success, NSError *error) {
if (error) NSLog(@"download of %@ failed: %@", operation.url, error);
};
[downloadQueue addOperation:downloadOperation];
}
}

下载操作可能类似于 this .显然,使用任何你想要的基于 NSOperation 的下载器,但我建议你使用一个不会将整个下载加载到内存中,而是直接将其流式传输到持久存储的下载器。

如果你不想那么花哨,你可以这样做:

NSOperationQueue *downloadQueue = [[NSOperationQueue alloc] init];
downloadQueue.maxConcurrentOperationCount = 4;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

for (NSString *urlString in urlStrings)
{
NSURL *url = [NSURL URLWithString:urlString];
NSString *path = [docsPath stringByAppendingPathComponent:[url lastPathComponent]];
if (![fileManager fileExistsAtPath:path]) {
[downloadQueue addOperationWithBlock:^{
NSString *path = [docsPath stringByAppendingPathComponent:[url lastPathComponent]];
NSData *data = [NSData dataWithContentsOfURL:url];
if (data)
[data writeToFile:path atomically:YES];
}];
}
}

很明显,使用您想要的任何下载操作类进行下载,但希望您了解基本概念。创建一个基于 NSOperation 的下载,然后为每个需要下载的文件提交一个。

关于ios - 将图像从 URL 保存到 iOS 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178127/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com