如何使用ASIHTTPRequest保存和检索下载的文件

时间:2012-05-03 06:46:24

标签: iphone multithreading download asihttprequest

我正在使用ASIHTTPRequest进行多次下载。这里使用异步下载方法,因此可以执行多次下载。它工作正常。 现在我想将这些下载文件保存到应用程序的本地文件夹(在设备中),并且还想要检索它(想要获取每个文件的路径)。我怎样才能做到这一点?在这里,多个下载正在执行如何区分下载中的每个文件? 这是我用过的代码。

- (void)download{
    UIImageView *image = (UIImageView *)[mainView viewWithTag:selectedTag];

    for (UIProgressView *currentProgress in [image subviews]) {
        if ([currentProgress isKindOfClass:[UIProgressView class]]) {
            NSLog(@"Prog tag: %d",currentProgress.tag);
            if(currentProgress)
            {
                currentProgress.progress = 0.0;
                ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[urlArray objectAtIndex:selectedTag]]];
                [request setDownloadProgressDelegate:currentProgress];
                [request setShowAccurateProgress:YES];                
                [request setDownloadDestinationPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"mansory_porsche_carrera_3-1920x1200.jpg"]];
                [request shouldContinueWhenAppEntersBackground];
                [request allowResumeForFileDownloads];
                [request startAsynchronous];

            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以相应地修改这些功能,并可以保存您想要的任何文件。

- (NSString *)applicationDocumentsDirectory 
{
  return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

- (void)saveImage:(UIImage*)image:(NSString*)imageName 
{
 NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.

 NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it

 NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory

 NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path 

 [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)

 NSLog(@"image saved");
}

为了检索你可以使用这些行来检查文件是否存在:

NSString *cachedImageFileUrl = [documentsDirectory stringByAppendingPathComponent:yourFileName];

NSFileManager *fileManager = [NSFileManager defaultManager];
if([fileManager fileExistsAtPath])
{
  //File exists...
}
else
{
}

告诉我它是否有帮助!!!

答案 1 :(得分:1)

首先,决定是否要使用块或使用委托函数。

如果你想使用块,那么由于ASIHTTPRequest是NSOperation的子类,你可以使用-setComplectionBlock来创建一个回调,当这个特定请求下载完成后将被调用

如果要使用委托函数,则将每个请求的委托设置为所需对象(可能是您的控制器),然后在同一对象-requestFinished和-requestFailed中实现,以便您可以处理响应。 / p>

每次url下载完成后,将使用下载文件作为参数的请求调用回调。此请求具有-responseData对象,当请求完成时,将填充下载的数据。这将是您的图像数据。

这是正常且最知道的方式。现在,你似乎直接这样做,但你已经设置了每个请求写在磁盘上的同一个文件!您确定以这种方式从多个图像中获取所需数据吗?在我看来,图像数据将在下载时重叠!

以下是我要做的事情:我会下载每个图像,在下载每个图像时,我会使用回调函数重命名生成的文件。之后,从同一个回调中,我将实际文件名存储在我的控制器中的NSMutableDictionary中。像[myDict setValue:“path / to / image.png”forKey:“myImage1”]之类的东西,以便我以后可以访问它们。

<<另外,我认为你应该放弃AIHTTPRequest,因为它已经被放弃了,但是开发人员。您可以使用AFNetworking作为一个很好的选择。它还提供进度回调,并且是基于块的。如果您想要iOS 4.0之前的兼容性,请忽略最后一段。 >>