如何将数据存储在did-receive-data中的NS-Mutable-data中,而不是写入文件

时间:2013-06-18 08:57:05

标签: iphone ios ipad asihttprequest nsdata

我被困2天我想显示下载进度条。 我将json发送到服务器并在响应服务器中发送给我视频数据。 要显示进度条,我会编写一些逻辑代码,如

didreceivedata的{​​{1}}方法中,我将使用全局ASIhttep附加接收数据,并在请求完成方法中将全局NSmutabledata写入文件。 但文件是空白的,它不会存储到文件中。

我知道ASIHttprequest是旧库,但是每个人都建议我使用AFnetworking但我不想更改代码,因为它需要花费很多时间而且我必须再次阅读文档。

任何人都可以帮助我如何追加数据并在完成下载之后将附加数据写入文件?

Nsmutalbedata

2 个答案:

答案 0 :(得分:0)

最好对这样的任务使用异步请求。您可以使用相同的 ASIHTTPRequest 类,但使用块方法。尝试编写类似于此的代码:

-(void) verifyReceipt {
    NSURL *theURL = [NSURL URLWithString:@"http://testing.io/dev.php/video/verifyReceipt"];
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f];
[theRequest setHTTPMethod:@"POST"];

    NSString *param1 = [self getParam1]; // getParam1 - some method to get useful data for request's body
    NSNumber *param2 = [self getParam2];
    NSString *postString = [NSString stringWithFormat:@"param1=%@&param2=%@", param1, param2];

    [theRequest setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:theRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {
         if ([data length] > 0 && error == nil) {
             //[delegate receivedData:data]; // - if you want to notify some delegate about data arrival
             NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
             NSString *filePath = [NSString stringWithFormat:@"%@/fileArrived.ext", rootPath];

             //try to access that local file for writing to it...
             NSFileHandle *hFile = [NSFileHandle fileHandleForWritingAtPath:filePath];
             //did we succeed in opening the existing file?
             if (!hFile)
             {   //nope->create that file!
                 [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
                 //try to open it again...
                 hFile = [NSFileHandle fileHandleForWritingAtPath:filePath];
             }
             //did we finally get an accessable file?
             if (!hFile)
             {   //nope->bomb out!
                 NSLog(@"could not write to file %@", filePath);
                 return;
             }
             //we never know - hence we better catch possible exceptions!
             @try
             {
                 //seek to the end of the file
                 [hFile seekToEndOfFile];
                 //finally write our data to it
                 [hFile writeData:data];
             }
             @catch (NSException * e)
             {
                 NSLog(@"exception when writing to file %@", filePath);
             }
             [hFile closeFile];
         } else if ([data length] == 0 && error == nil) {
             //            [delegate emptyReply];
         } else if (error != nil && error.code == NSURLErrorTimedOut) {
             //            [delegate timedOut];
         } else if (error != nil) {
             //            [delegate downloadError:error];
         }
         [queue release];
     }];
}

这会将每个到达的大数据块追加到您想要的文件中。 根据您的需求自定义请求POST主体,这应该可行。异步:)

答案 1 :(得分:0)

好的,首先检查你的文件路径,我通常更喜欢以这种方式引用文件路径:

您需要以这种方式获取应用程序的根目录:

NSString* rootPath = NSHomeDirectory();

并将数据保存在Apple file system guide line

指定的子文件夹之一中
NSString* fullPath = [rootPath stringByAppendingPathComponent:@"subFoldeder/file.extension"];

关于将新数据附加到旧数据,一个非常快速的解决方案是以这种方式初始化您的videoData:

NSMutableData *videoData = [[NSMutableData alloc] initWithContentsOfFile:@"filePath"];

之后,您可以在收到数据时继续追加数据,并在结尾处写完整个文件

正确的做法是,不要使用太多的内存应该打开一个文件找到它并将数据附加到文件