0

我想在 ASIHttprequest 库上显示下载进度条(HUD 进度条)。我试过这个[request setDownloadProgressDelegate:loadingHUD]; [request setShowAccurateProgress:YES]; [request setDelegate:self]; 但运气不好,它在开始下载时显示空白,最后直接显示完整进度。所以我记录了进度值,我得到了set progress0.000000 set progress1.000000

如何获得 HUD 进度条的准确进度更新。

我将带有数据的 Json 发送到我的服务器和服务器验证它,如果它验证没问题,而不是发回我的视频数据作为响应..我想将该响应存储到视频文件中,所以我正在使用它

这是我的代码

loadingHUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
loadingHUD.labelText = NSLocalizedString(@"Downloading", nil);
loadingHUD.mode=MBProgressHUDModeAnnularDeterminate;
[loadingHUD showWhileExecuting:@selector(verifyReceipt:) onTarget:self       withObject:transaction animated:YES];
// call the verify receipt method and download the file
 [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
     }
 - (void)verifyReceipt:(SKPaymentTransaction *)transaction {
 // string to NSdictionary and dictioanry to json string

NSArray *mainObjects = [NSArray arrayWithObjects:vendorId,deviceData,productID,nil]; // purchased Item ID of previous item
NSArray *mainKeys = [NSArray arrayWithObjects:@"ID",@"device",@"video",nil];
NSDictionary *mainDictionary = [NSDictionary dictionaryWithObjects:mainObjects forKeys:mainKeys]; // final string of data
NSLog(@"Json Main dict created");
      NSString *sandBox=@"1";
   NSArray *testobj = [NSArray arrayWithObjects:mainDictionary,receiptDataEncoded,sandBox,nil]; // purchased Item ID of previous item
  NSArray *testkey = [NSArray arrayWithObjects:@"data",@"receiptData",@"sandbox",nil];
  NSDictionary *testdict = [NSDictionary dictionaryWithObjects:testobj forKeys:testkey];         // final string of data
  NSLog(@"Json Main dict created");


  NSError *error;
  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:testdict options:NSJSONWritingPrettyPrinted error:&error];
  NSString *resultAsString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  NSLog(@"Purchase product Json string:\n%@", resultAsString);

 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[[NSURL alloc] initWithString:@"http://testing.test.io/dev.php/video/verifyReceipt"]];


//[request setDidReceiveDataSelector:@selector(request:didReceiveBytes:)];
[request setPostValue:resultAsString forKey:@"verify"];
[request setDidFinishSelector:@selector(requestDone:)];
[request setTimeOutSeconds:120];
[request setNumberOfTimesToRetryOnTimeout:2];
// request.showAccurateProgress=YES;
 [request setDownloadProgressDelegate:loadingHUD];
 [request setShowAccurateProgress:YES];
 request setDelegate:self];
 //[request setDownloadProgressDelegate:self];

 // SAVED video PATH
 // Get the Document directory
 NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
 // Add your filename to the directory to create your saved pdf location
 NSString *movLocation = [documentDirectory stringByAppendingPathComponent:[fileName st ringByAppendingString:@".mov"]];

  // TEMPORARY video PATH
  // Get the Caches directory
   NSString *cachesDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
  // Add your filename to the directory to create your temp pdf location
  NSString *tempMovLocation = [cachesDirectory stringByAppendingPathComponent:[fileName stringByAppendingString:@".mov"]];

 // Tell ASIHTTPRequest where to save things:
 [request setTemporaryFileDownloadPath:tempMovLocation];
 [request setDownloadDestinationPath:movLocation];
 [request startSynchronous];

NSLog(@"Path is %@",movLocation);
   }

- (void)setProgress:(float)progress1
    {
[loadingHUD setProgress:progress1];
NSLog(@"set progress%f",progress1);
     }

   - (void)requestDone:(ASIHTTPRequest *)request{
//[MBProgressHUD hideHUDForView:self.view animated:YES];

  if(request.responseStatusCode==200)
   {
    //BOOL success = [videoData writeToFile:movLocation atomically:NO];
   // NSLog(@"bool value is%d",success);
    NSLog(@"in request done sucsessfully downlaod and store in database %d",request.responseStatusCode);
    [DBHelper savePurchaseId:fileName];
    [self movieReceived];
       }
     else{

     NSLog(@"in request downlaod and store in database failed %@",request.responseHeaders);

 }
  }

     -(void)requestFailed:(ASIHTTPRequest *)request
   {

  NSLog(@"%@",request.error);

    }

如果我使用 didreceivebytes 比我的文件不会被下载..

-(void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes {
 NSLog(@"Received bytes:%lld",bytes); progress = 0.0f; if (progress < 1.0f)

 {
     progress = ((float)bytes) / 469690;
     NSLog(@"progress value is %f",progress);
     loadingHUD.progress = progress;
 }

}

感谢您提供任何帮助谢谢

4

1 回答 1

0

我通过使用 afnetworking 和 reloving setparameterencoding 并在字典中添加 post 值来解决

  NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// Add your filename to the directory to create your saved pdf location
NSString* destPath = [documentDirectory stringByAppendingPathComponent:[fileName stringByAppendingString:@".mov"]];

NSURL *url = [NSURL URLWithString:@"http:/testing.io"]; // 
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
// [httpClient setParameterEncoding:AFJSONParameterEncoding];// no need of this line remove 

NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"dev.php/video/verifyReceipt" parameters:postRequest]; // /dev.php/video/verifyReceipt
NSLog(@"postRequest: %@", postRequest);

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:destPath append:NO];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
 {
     // Give alert that downloading successful.
     NSLog(@"Successfully downloaded file to %@", destPath);


     // [self.target parserDidDownloadItem:destPath];

     HUD.detailsLabelText = [NSString stringWithFormat:@"%@ %i%%",@"Downloading",100];
     [HUD hide:TRUE];

     [DBHelper savePurchaseId:fileName];
     [self movieReceived];

 }
                                 failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     // Give alert that downloading failed
     NSLog(@"Error: %@", error);

     // [self.target parserDidFailToDownloadItem:error];
     [HUD hide:TRUE];

 }];
[operation setDownloadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite)
 {
     // Progress
     float totalProgress = (totalBytesWritten / (totalBytesExpectedToWrite * 1.0f) * 100);
     HUD.detailsLabelText = [NSString stringWithFormat:@"Downloading %i%%", MIN((int)(totalProgress), 99)];
 }];
[operation start];

}

于 2013-06-19T10:18:47.013 回答